PermissionEvaluator会被自动注册到Spring Security框架,并允许在注解内使用如下方式进行鉴权。
@PreAuthorize("hasPermission(#id, 'QUERY')") Object func1(String id) { } @PreAuthorize("hasPermission(#id, 'TABLE', 'QUERY')") Object func2(String id) { }其中,func1的注解表示校验用户是否对id有QUERY权限,代码逻辑路由到MyPermissionEvaluator的第一个接口。func2的注解表示校验用户是否对TABLE类型的id有QUERY权限,代码逻辑路由到MyPermissionEvaluator的第二个接口。PermissionEvaluator提供了权限系统中数据鉴权的扩展点,稍后会描述如何利用该扩展点定制基于RBAC的权限系统。
五、权限系统构建基于RBAC(Role Based Access Control)的权限系统,需要明确用户、角色、权限、资源这几个核心的概念类的含义和它们之间的关系。
资源:权限系统内需要安全控制的客体,一般是系统内的数据或功能。
权限:描述了资源上的操作抽象,一般是一种动作。
授权:是权限和资源的组合,表示对资源的某一个操作。
角色:描述了一组授权的集合,表示一类特殊概念的功能集。
用户:权限系统的主体,一般是当前系统的访问用户,用户可以拥有多种角色。
以下是我们设计的基于RABC的权限核心领域模型:
一般情况下,系统内需要权限管控的资源是无法用户自定义的,因为资源会耦合大量的业务逻辑,所以我们提供了自 资源工厂,通过配置化的方式构建业务模块所需的资源。而用户、角色、权限,以及授权记录都是可以通过相应的管理器进行查询更新。
另外,资源抽象允许表达资源的继承和组合关系,继而表达更复杂的资源模型,资源统一鉴权的流程为:
执行鉴权时,首先看资源是原子资源还是组合资源。
对于原子资源,先查询是否有授权记录,再查看角色预授权是否包含当前授权,存在一种便成功。
没有授权记录和角色预授权的原子资源,尝试用父资源(如果有的话)代替鉴权,否则鉴权失败。
对于组合资源,先进行资源展开,获取子资源列表。
遍历子资源列表,并依次对子资源进行鉴权,子资源鉴权结果汇总后,即组合资源鉴权结果。
综上,基于统一资源抽象和资源配置化构建,可以实现资源的统一构建,继而实现统一鉴权。
六、总结回顾本文从Spring Security的架构和原理出发,描述了开源安全框架对于认证和鉴权模块的设计思路和细节。并提供了系统内集成Spring Security的方法,结合RBAC通用权限系统模型,讨论了统一资源构建和统一鉴权的设计和实现。如果你也需要设计一个新的权限系统,希望本文对你有所帮助。