Shiro学习之授权实现(二)

Shiro支持三种方式实现授权过程:

  • 编码实现
  • 注解实现
  • JSP Taglig实现

1、基于编码的授权实现

基于传统角色授权实现
当需要验证用户是否拥有某个角色时,可以调用Subject 实例的hasRole()方法验证

Subject currentUser = SecurityUtils.getSubject();  
if (currentUser.hasRole("administrator")) {  
    //show the admin button  
} else {  
    //don't show the button?  Grey it out?  
} 

Subject方法 描述

1:hasRole(String roleName)
当用户拥有指定角色时,返回true

2:hasRoles(List<String> roleNames)
按照列表顺序返回相应的一个boolean值数组

3:hasAllRoles(Collection<String> roleNames)
如果用户拥有所有指定角色时,返回true

断言支持
Shiro还支持以断言的方式进行授权验证。断言成功,不返回任何值,程序继续执行;断言失败时,将抛出异常信息。使用断言,可以使我们的代码更加简洁。

Subject currentUser = SecurityUtils.getSubject();  
currentUser.checkRole("bankTeller");  
openBankAccount(); 

断言的相关方法: Subject方法 描述

checkRole(String roleName)  
断言用户是否拥有指定角色
checkRoles(Collection<String> roleNames)    
断言用户是否拥有所有指定角色
checkRoles(String... roleNames)
对上一方法的方法重载

基于权限角色授权实现
相比传统角色模式,基于权限的角色模式耦合性要更低些,它不会因角色的改变而对源代码进行修改,因此,基于权限的角色模式是更好的访问控制方式。
它的代码实现有以下几种实现方式:
1、基于权限对象的实现
创建org.apache.shiro.authz.Permission的实例,将该实例对象作为参数传递给Subject.isPermitted()进行验证。

Permission printPermission = new PrinterPermission("laserjet4400n", "print");  
Subject currentUser = SecurityUtils.getSubject();  
if (currentUser.isPermitted(printPermission)) {  
    //show the Print button  
} else {  
    //don't show the button?  Grey it out?  
}  

相关方法如下: Subject方法 描述

isPermitted(Permission p)   
Subject拥有制定权限时,返回true

isPermitted(List<Permission> perms) 
返回对应权限的boolean数组

isPermittedAll(Collection<Permission> perms)    
Subject拥有所有制定权限时,返回true

2、 基于字符串的实现
相比笨重的基于对象的实现方式,基于字符串的实现便显得更加简洁。

Subject currentUser = SecurityUtils.getSubject();  
if (currentUser.isPermitted("printer:print:laserjet4400n")) {  
    //show the Print button  
} else {  
    //don't show the button?  Grey it out?  
}  

使用冒号分隔的权限表达式是org.apache.shiro.authz.permission.WildcardPermission默认支持的实现方式。
这里分别代表了 资源类型:操作:资源ID

类似基于对象的实现相关方法,基于字符串的实现相关方法:

isPermitted(String perm)
isPermitted(String... perms)
isPermittedAll(String... perms) 

基于权限对象的断言实现

Subject currentUser = SecurityUtils.getSubject();  

Permission p = new AccountPermission("open");  
currentUser.checkPermission(p);  
openBankAccount();  

基于字符串的断言实现

Subject currentUser = SecurityUtils.getSubject();    
currentUser.checkPermission("account:open");  
openBankAccount();  

断言实现的相关方法 Subject方法 说明

checkPermission(Permission p)   
断言用户是否拥有制定权限

checkPermission(String perm)    
断言用户是否拥有制定权限

checkPermissions(Collection<Permission> perms)  
断言用户是否拥有所有指定权限

checkPermissions(String... perms)   
断言用户是否拥有所有指定权限

转自博客:https://blog.csdn.net/xiaoliuliu2050/article/details/54911480

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值