shiro

原文:https://blog.csdn.net/qq_30739519/article/details/51473990

1 shiro授权

shiro授权,分享牛系列,分享牛专栏,分享牛。shiro授权原理,shiro授权分析。

shiro授权

1.1 授权流程

 

1.2 授权方式

Shiro 支持三种方式的授权:

 编程式:通过写if/else 授权代码块完成:

Subject subject = SecurityUtils.getSubject();

if(subject.hasRole(“admin”)) {

//有权限

} else {

//无权限

}

注解式:通过在执行的Java方法上放置相应的注解完成:

@RequiresRoles("admin")

public void hello() {

//有权限

}

JSP/GSP 标签:在JSP/GSP 页面通过相应的标签完成:

<shiro:hasRole name="admin">

<!— 有权限—>

</shiro:hasRole>

本教程序授权测试使用第一种编程方式,实际与web系统集成使用后两种方式。

1.3 授权测试

1.3.1 shiro-permission.ini

创建存放权限的配置文件shiro-permission.ini,如下:

[html]  view plain  copy
  1. [users]  
  2. #用户zhang的密码是123,此用户具有role1和role2两个角色  
  3. zhang=123,role1,role2  
  4. wang=123,role2  
  5.   
  6. [roles]  
  7. #角色role1对资源user拥有create、update权限  
  8. role1=user:create,user:update  
  9. #角色role2对资源user拥有create、delete权限  
  10. role2=user:create,user:delete  
  11. #角色role3对资源user拥有create权限  
  12. role3=user:create  

ini文件中用户、角色、权限的配置规则是:“用户名=密码,角色1,角色2...” “角色=权限1,权限2...”,首先根据用户名找角色,再根据角色找权限,角色是权限集合。

1.3.2 权限字符串规则

权限字符串的规则是:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。

例子:

用户创建权限:user:create,或user:create:*

用户修改实例001的权限:user:update:001

用户实例001的所有权限:user*001

1.3.3 测试代码

 

测试代码同认证代码,注意ini地址改为shiro-permission.ini,主要学习下边授权的方法,注意:在用户认证通过后执行下边的授权代码。

[java]  view plain  copy
  1. @Test  
  2.     public void testPermission() {  
  3.   
  4.         // 从ini文件中创建SecurityManager工厂  
  5.         Factory<SecurityManager> factory = new IniSecurityManagerFactory(  
  6.                 "classpath:shiro-permission.ini");  
  7.   
  8.         // 创建SecurityManager  
  9.         SecurityManager securityManager = factory.getInstance();  
  10.   
  11.         // 将securityManager设置到运行环境  
  12.         SecurityUtils.setSecurityManager(securityManager);  
  13.   
  14.         // 创建主体对象  
  15.         Subject subject = SecurityUtils.getSubject();  
  16.   
  17.         // 对主体对象进行认证  
  18.         // 用户登陆  
  19.         // 设置用户认证的身份(principals)和凭证(credentials)  
  20.         UsernamePasswordToken token = new UsernamePasswordToken("zhang""123");  
  21.         try {  
  22.             subject.login(token);  
  23.         } catch (AuthenticationException e) {  
  24.             // TODO Auto-generated catch block  
  25.             e.printStackTrace();  
  26.         }  
  27.   
  28.         // 用户认证状态  
  29.         Boolean isAuthenticated = subject.isAuthenticated();  
  30.   
  31.         System.out.println("用户认证状态:" + isAuthenticated);  
  32.   
  33.         // 用户授权检测 基于角色授权  
  34.         // 是否有某一个角色  
  35.         System.out.println("用户是否拥有一个角色:" + subject.hasRole("role1"));  
  36.         // 是否有多个角色  
  37.         System.out.println("用户是否拥有多个角色:" + subject.hasAllRoles(Arrays.asList("role1""role2")));  
  38.           
  39. //      subject.checkRole("role1");  
  40. //      subject.checkRoles(Arrays.asList("role1", "role2"));  
  41.   
  42.         // 授权检测,失败则抛出异常  
  43.         // subject.checkRole("role22");  
  44.   
  45.         // 基于资源授权  
  46.         System.out.println("是否拥有某一个权限:" + subject.isPermitted("user:delete"));  
  47.         System.out.println("是否拥有多个权限:" + subject.isPermittedAll("user:create:1",    "user:delete"));  
  48.           
  49.         //检查权限  
  50.         subject.checkPermission("sys:user:delete");  
  51.         subject.checkPermissions("user:create:1","user:delete");  
  52.           
  53.   
  54.     }  

1.3.4 基于角色的授权

[html]  view plain  copy
  1. // 用户授权检测 基于角色授权  
  2.         // 是否有某一个角色  
  3.         System.out.println("用户是否拥有一个角色:" + subject.hasRole("role1"));  
  4.         // 是否有多个角色  
  5.         System.out.println("用户是否拥有多个角色:" + subject.hasAllRoles(Arrays.asList("role1", "role2")));  

 

对应的check方法:

[html]  view plain  copy
  1. subject.checkRole("role1");  
  2. subject.checkRoles(Arrays.asList("role1", "role2"));  

上边check方法如果授权失败则抛出异常:

org.apache.shiro.authz.UnauthorizedException: Subject does not have role [.....]

1.3.5 基于资源授权

[html]  view plain  copy
  1. // 基于资源授权  
  2.         System.out.println("是否拥有某一个权限:" + subject.isPermitted("user:delete"));  
  3.         System.out.println("是否拥有多个权限:" + subject.isPermittedAll("user:create:1",    "user:delete"));  

对应的check方法:

[html]  view plain  copy
  1. subject.checkPermission("sys:user:delete");  
  2. subject.checkPermissions("user:create:1","user:delete");  

上边check方法如果授权失败则抛出异常:

org.apache.shiro.authz.UnauthorizedException: Subject does not have permission [....]



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值