RBAC权限控制模型(Role-Based Access Control)基于角色的访问控制。
RBAC认为权限的过程可以抽象概括为:判断【Who是否可以对What进行How的访问操作(Operator)】这个逻辑表达式的值是否为True的求解过程。
其实就是要求抽象出不同的角色,角色拥有不同的权限,当一个用户符合某个角色的时候,将角色和用户绑定,那么用户就拥有了和角色相同的权限。
下面我来讲一个shiro框架,是一个用来做角色访问控制的,但因为我们的项目不仅需要具体到角色和权限,还要具体到谁在哪里具有公司/分公司/部门/个人的权限,同时也要确定是查询还是编辑权限,所以较为困难,另外建议学习spirng security,也能解决项目的权限问题。现在的权限是直接通过interceptor拦截器完成的权限判断和拦截
Subject:主体,代表了当前“用户”,这个用户不一定是一个具体的人,而是与当前应用交互的任何东西都是Subject,如爬虫机器人等。即一个抽象概念。所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager,可以把Subject认为是一个门面,SecurityManager才是真正的执行者。
SecurityManager:安全管理器;即所有与安全有关的操作都会与SecurityManager交互,且它管理者所有的Subject,是Shiro的核心,它负责与后边介绍的其他组件进行交互,如果学习过Spring MVC,可以看成是DispatcherServlet前端控制器。
Realm:(域或者范围)其实就是安全的数据源,外界的验证(如用户、角色、权限)需要从这里来获取正确的数据进行对比。
- Realm中有两个方法:
- AuthorizationInfo:授权,当用户合法的时候,就会从数据库获取该用户的角色和权限。然后将角色和权限信息写入到该info中。SecurityManager就会根据返回的角色和权限名称等来判断当前路径是否有权访问。判断规则卸载了Shiro的配置文件中。
- AuthenticationInfo:身份验证、登录信息,验证用户是不是合法身份。
到底是怎么判断权限的呢?
Shiro可以配置权限过滤器,当Shiro通过Realm获取到了AuthenticationInfo和AuthorizationInfo的时候,它就拥有了该用户的登录以及角色和权限信息。这样它就可以通过过滤器来进行过滤
- anno: /admins/**=anon 没有参数,表示可以匿名使用
- authc:/admins/user/**=auth表示需要认证登录才能使用,没有参数
- roles:例子/admins/user/**=roles[“admin”,“guest”],在括号中参数可以写多个,多个时要用引号且用逗号分隔。表示当前用户只有拥有这两个角色才能放行。
- perms:/admins/user/**=perms[user:add:*],参数可以写多个,多个时用逗号分隔,表示该用户必须有这几个权限才能通行
- rest:例子/admins/user/=rest[user],根据请求的方法,相当于/admins/user/=perms[user:method] ,其中method为post,get,delete等。
- port: 例子/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal: //serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的 host,8081是url配置里port的端口,queryString是你访问的url里的?后面的参数。
这些过滤器中anon,authcBasic,auchc,user是认证过滤器,perms,roles,ssl,rest,port是授权过滤器
至此配置工作已完成。