Spring security(五)-完美权限管理系统(授权过程分析)

1. 权限管理相关概念

  权限管理是一个几乎所有后台系统的都会涉及的一个重要组成部分,主要目的是对整个后台管理系统进行权限的控制。常见的基于角色的访问控制,其授权模型为“用户-角色-权限”,简明的说,一个用户拥有多个角色,一个角色拥有多个权限。其中,

  • 用户: 不用多讲,大家也知道了;
  • 角色: 一个集合的概念,角色管理是确定角色具备哪些权限的一个过程 ;
  • 权限:
    1).页面权限,控制你可以看到哪个页面,看不到哪个页面;
        2). 操作权限,控制你可以在页面上进行哪些操作(查询、删除、编辑等);
        3).数据权限,是控制你可以看到哪些数据。

实质是:
 权限(Permission) = 资源(Resource) + 操作(Privilege)
 角色(Role) = 权限的集合(a set of low-level permissions)
 用户(User) = 角色的集合(high-level roles)

权限管理过程:

  1. 鉴权管理,即权限判断逻辑,如菜单管理(普通业务人员登录系统后,是看不到【用户管理】菜单的)、功能权限管理(URL访问的管理)、行级权限管理等
  2. 授权管理,即权限分配过程,如直接对用户授权,直接分配到用户的权限具有最优先级别、对用户所属岗位授权,用户所属岗位信息可以看作是一个分组,和角色的作用一样,但是每个用户只能关联一个岗位信息等。

  在实际项目中用户数量多,逐一的为每个系统用户授权,这是极其繁琐的事,所以可以学习linux文件管理系统一样,设置group模式,一组有多个用户,可以为用户组授权相同的权限,简便多了。这样模式下:
  每个用户的所有权限=用户个人的权限+用户组所用的权限
用户组、用户、与角色三者关系如下:

再结合权限管理的页面权限、操作权限,如菜单的访问、功能模块的操作、按钮的操作等等,可把功能操作与资源统一管理,即让它们直接与权限关联起来,关系图如下:

2. 授权过程分析

2.1 授权访问权限工作流程:

        FilterSecurityInterceptor
                             doFilter()->invoke()
                               ->AbstractSecurityInterceptor
                                   beforeInvocation()
                           ->SecurityMetadataSource 获取ConfigAttribute属性信息(从数据库或者其他数据源地方)
                                       getAttributes()
                                   ->AccessDecisionManager()  基于AccessDecisionVoter实现授权访问
                                           Decide()
                                       ->AccessDecisionVoter  受AccessDecisionManager委托实现授权访问
                                               vote()

默认授权过程会使用这样的工作流程,接下来来分析各个组件的功能与源码。

2.2 AbstractSecurityInterceptor分析

  FilterSecurityInterceptor为授权拦截器, 在FilterSecurityInterceptor中有一个封装了过滤链request以及responseFilterInvocation对象进行操作,在FilterSecurityInterceptor,主要由invoke()调用其父类AbstractSecurityInterceptor的方法。

invoke()分析:

 public void invoke(FilterInvocation fi) throws IOException, ServletException {
                 .....
                 // 获取accessDecisionManager权限决策后结果状态、以及权限属性
		InterceptorStatusToken token = super.beforeInvocation(fi);

		try {
			fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
		}
		finally {
			super.finallyInvocation(token);
		}

		super.afterInvocation(token, null);
	}
}

  A

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值