1. 权限管理相关概念
权限管理是一个几乎所有后台系统的都会涉及的一个重要组成部分,主要目的是对整个后台管理系统进行权限的控制。常见的基于角色的访问控制,其授权模型为“用户-角色-权限”,简明的说,一个用户拥有多个角色,一个角色拥有多个权限。其中,
- 用户: 不用多讲,大家也知道了;
- 角色: 一个集合的概念,角色管理是确定角色具备哪些权限的一个过程 ;
- 权限:
1).页面权限,控制你可以看到哪个页面,看不到哪个页面;
2). 操作权限,控制你可以在页面上进行哪些操作(查询、删除、编辑等);
3).数据权限,是控制你可以看到哪些数据。
实质是:
权限(Permission) = 资源(Resource) + 操作(Privilege)
角色(Role) = 权限的集合(a set of low-level permissions)
用户(User) = 角色的集合(high-level roles)
权限管理过程:
- 鉴权管理,即权限判断逻辑,如菜单管理(普通业务人员登录系统后,是看不到【用户管理】菜单的)、功能权限管理(URL访问的管理)、行级权限管理等
- 授权管理,即权限分配过程,如直接对用户授权,直接分配到用户的权限具有最优先级别、对用户所属岗位授权,用户所属岗位信息可以看作是一个分组,和角色的作用一样,但是每个用户只能关联一个岗位信息等。
在实际项目中用户数量多,逐一的为每个系统用户授权,这是极其繁琐的事,所以可以学习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以及response的FilterInvocation对象进行操作,在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