shiro基础学习

查了一些资料,觉得这篇博客不错转载保存

转自

https://blog.csdn.net/sihai12345/article/details/68948456


1 shiro授权

 

1.1 授权流程

 

1.2 授权方式

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页面通过相应的标签完成:

<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.   
  3. public void testPermission() {  
  4.   
  5.    
  6.   
  7. // 从ini文件中创建SecurityManager工厂  
  8.   
  9. Factory<SecurityManager> factory = new IniSecurityManagerFactory(  
  10.   
  11. "classpath:shiro-permission.ini");  
  12.   
  13.    
  14.   
  15. // 创建SecurityManager  
  16.   
  17. SecurityManager securityManager = factory.getInstance();  
  18.   
  19.    
  20.   
  21. // 将securityManager设置到运行环境  
  22.   
  23. SecurityUtils.setSecurityManager(securityManager);  
  24.   
  25.    
  26.   
  27. // 创建主体对象  
  28.   
  29. Subject subject = SecurityUtils.getSubject();  
  30.   
  31.    
  32.   
  33. // 对主体对象进行认证  
  34.   
  35. // 用户登陆  
  36.   
  37. // 设置用户认证的身份(principals)和凭证(credentials)  
  38.   
  39. UsernamePasswordToken token = new UsernamePasswordToken("zhang""123");  
  40.   
  41. try {  
  42.   
  43. subject.login(token);  
  44.   
  45. catch (AuthenticationException e) {  
  46.   
  47. // TODO Auto-generated catch block  
  48.   
  49. e.printStackTrace();  
  50.   
  51. }  
  52.   
  53.    
  54.   
  55. // 用户认证状态  
  56.   
  57. Boolean isAuthenticated = subject.isAuthenticated();  
  58.   
  59.    
  60.   
  61. System.out.println("用户认证状态:" + isAuthenticated);  
  62.   
  63.    
  64.   
  65. // 用户授权检测 基于角色授权  
  66.   
  67. // 是否有某一个角色  
  68.   
  69. System.out.println("用户是否拥有一个角色:" + subject.hasRole("role1"));  
  70.   
  71. // 是否有多个角色  
  72.   
  73. System.out.println("用户是否拥有多个角色:" + subject.hasAllRoles(Arrays.asList("role1""role2")));  
  74.   
  75. //subject.checkRole("role1");  
  76.   
  77. //subject.checkRoles(Arrays.asList("role1", "role2"));  
  78.   
  79.    
  80.   
  81. // 授权检测,失败则抛出异常  
  82.   
  83. // subject.checkRole("role22");  
  84.   
  85.    
  86.   
  87. // 基于资源授权  
  88.   
  89. System.out.println("是否拥有某一个权限:" + subject.isPermitted("user:delete"));  
  90.   
  91. System.out.println("是否拥有多个权限:" + subject.isPermittedAll("user:create:1","user:delete"));  
  92.   
  93. //检查权限  
  94.   
  95. subject.checkPermission("sys:user:delete");  
  96.   
  97. subject.checkPermissions("user:create:1","user:delete");  
  98.   
  99.    
  100.   
  101. }  


 

 

1.3.4 基于角色的授权

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


 

对应的check方法:


subject.checkRole("role1");

subject.checkRoles(Arrays.asList("role1","role2"));

 

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

[java]  view plain  copy
  1. org.apache.shiro.authz.UnauthorizedException: Subject does not have role [.....]  


 

 

1.3.5 基于资源授权

 

[java]  view plain  copy
  1. // 基于资源授权  
  2.   
  3. System.out.println("是否拥有某一个权限:" + subject.isPermitted("user:delete"));  
  4.   
  5. System.out.println("是否拥有多个权限:" + subject.isPermittedAll("user:create:1","user:delete"));  
  6.   
  7. 对应的check方法:  
  8.   
  9. subject.checkPermission("sys:user:delete");  
  10.   
  11. subject.checkPermissions("user:create:1","user:delete");  


 

 

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

[java]  view plain  copy
  1. org.apache.shiro.authz.UnauthorizedException: Subject does not have permission [....]  


 

 

1.4 自定义realm

与上边认证自定义realm一样,大部分情况是要从数据库获取权限数据,这里直接实现基于资源的授权。

1.4.1 realm代码

 

在认证章节写的自定义realm类中完善doGetAuthorizationInfo方法,此方法需要完成:根据用户身份信息从数据库查询权限字符串,由shiro进行授权。

 

[java]  view plain  copy
  1. // 授权  
  2.   
  3. @Override  
  4.   
  5. protected AuthorizationInfo doGetAuthorizationInfo(  
  6.   
  7. PrincipalCollection principals) {  
  8.   
  9. // 获取身份信息  
  10.   
  11. String username = (String) principals.getPrimaryPrincipal();  
  12.   
  13. // 根据身份信息从数据库中查询权限数据  
  14.   
  15. //....这里使用静态数据模拟  
  16.   
  17. List<String> permissions = new ArrayList<String>();  
  18.   
  19. permissions.add("user:create");  
  20.   
  21. permissions.add("user.delete");  
  22.   
  23. //将权限信息封闭为AuthorizationInfo  
  24.   
  25. SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();  
  26.   
  27. for(String permission:permissions){  
  28.   
  29. simpleAuthorizationInfo.addStringPermission(permission);  
  30.   
  31. }  
  32.   
  33. return simpleAuthorizationInfo;  
  34.   
  35. }  


 

 

1.4.2 shiro-realm.ini

ini配置文件还使用认证阶段使用的,不用改变。


 

1.4.3 测试代码

同上边的授权测试代码,注意修改ini地址为shiro-realm.ini

 

 

1.4.4 授权执行流程

1、 执行subject.isPermitted("user:create")

2、 securityManager通过ModularRealmAuthorizer进行授权

3、 ModularRealmAuthorizer调用realm获取权限信息

4、ModularRealmAuthorizer再通过permissionResolver解析权限字符串,校验是否匹配



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值