一、授权理解
授权:也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、 角色(Role)
(1)主体:即访问应用的用户,在Shiro中使用Subject代表该用户。用户只有授权后才允许访问相应的资源
(2)资源:在应用中用户可以访问的任何东西,比如访问JSP 页面、查看/编辑某些数据、访问某个业 务方法、打印文本等等都是资源。用户只要授权后才能访问
(3)权限:安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的权力。即权限表示在应用中用户能不能访问某个资源,如:访问用户列表页面、查看/新增/修改/删除用户数据(即很多时候都是CRUD(增查改删)式权限控制)、打印文档等等
(4)角色:代表了操作集合,可以理解为权限的集合,一般情况下我们会赋予用户角色而不是权限,即这样用户可以拥有一组权限,赋予权限时比较方便。典型的如:项目经理、技术总 监、CTO、开发工程师等都是角色,不同的角色拥有一组不同的权限
二、授权方式
Shiro 支持三种方式的授权:
(1)编程式:通过写if/else 授权代码块完成
Subject subject = SecurityUtils.getSubject();
if(subject.hasRole(“admin”))
{ //有权限 }
else
{ //无权限 }
(2)注解式:通过在执行的Java方法上放置相应的注解完成,没有权限将抛出相应的异常
@RequiresRoles("admin")
public void hello()
{ //有权限 }
(3)JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成
三、授权过滤器
roles、perms、port、rest、ssl
四、授权原理
说明:
(1)首先会获取用户输入的账户/密码等
(2)调用Subject.isPermitted*/hasRole*接口,其会委托给SecurityManager,而 SecurityManager接着会委托给Authorizer
(3)Authorizer是真正的授权者,如果我们调用如isPermitted(“user:view”),其首先会通过PermissionResolver把字符串转换成相应的Permission实例
(4)在进行授权之前,其会调用相应的Realm获取Subject相应的角色/权限用于匹配传入的角色/权限
(5)Authorizer会判断Realm的角色/权限是否和传入的匹配,如果有多个Realm,会委托给ModularRealmAuthorizer进行循环判断,如果匹配如isPermitted*/hasRole*会返回true,否则返回false表示授权失败
五、多Realm授权规则
(1)首先检查相应的Realm是否实现了实现了Authorizer
(2)如果实现了Authorizer,那么接着调用其相应的isPermitted*/hasRole*接口进行匹配
(3)如果有一个Realm匹配那么将返回true,否则返回false