(2)shiro角色资源权限

 正文

一般在web系统权限设计中,一般分为三个维度,用户,角色,资源,一个用户可以拥有多个角色,比如说可以是老师,也可以是班主任,一个角色也可以拥有多个资源。

比如老师同时拥有查看班级学生和批改作业的资源,如果一个用户有老师这个角色,那么就代表他拥有了查看班级学生和批改作业的两个资源权限。

因为只判断角色颗粒度太粗,而根据资源权限则比较细。

 

[users] zhang=123456,role1 [roles] role1=user:create,user:update
复制代码

测试代码:

复制代码
        Factory<SecurityManager> factory =new IniSecurityManagerFactory("classpath:shiro-role.ini");         //得到安全管理器        SecurityManager securityManager = factory.getInstance();         //将securityManager托管给SecurityUtils        SecurityUtils.setSecurityManager(securityManager);          Subject subject = SecurityUtils.getSubject();          UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123456");          try {             subject.login(token);         } catch (AuthenticationException e) {             e.printStackTrace();         }         //是否已经认证        System.out.println(subject.isAuthenticated());          //校验是否有对应的权限和资源,如果没有则抛出对应的异常UnauthorizedException        subject.checkRole("role1");         subject.checkPermission("user:create");         //退出        subject.logout();
复制代码

过程没有遇到任何错误,执行到了最后,但是如果你check一个zhang不存在的role或者permission,则会报UnauthorizedException。

 

 

 

 

 他会根据当前设置了几个realm走不同的方法(后面介绍多个realms)

 最终走的realm对应的getAuthenticationInfo方法,判断用户账号密码是否正确,如果错误则抛出对应的异常。正确则返回一个AuthenticationInfo对象。(这里是SimpleAuthenticationInfo)

 所以后面我们自定义realms的时候就覆盖getAuthenticationInfo这个方法即可。

 

hasRole然后又走了下面的方法

最后获取到了所有的realms,上篇文章说了java环境下使用了IniRealm,并且注入到了Authenticator(认证器)和Authorizer(授权器)的一个成员变量中。

所以getRealms就可以直接获取到所有的realms

因为IniRealms继承了AuthorizingRealm,而IniRealm没有实现hasRole方法,所以会走他的继承类AuthorizingRealm里面的hasRole来判断是否有权限。下面就是对应的方法。

在初始化IniRealm的时候会读取所有用户所属的role和permission并封装到成员变量中,getAuthorizationInfo方法就是返回了一个AuthorizationInfo对象里面获取了zhang所属role和permission。

所以我们自定义realm进行授权的时候就是覆盖了realm的getAuthorizationInfo方法,里面封装的role和permission都是从数据库查询出来的。

 

最后进行checkRole就很容易看懂了。

 

如果返回false,则Authorizer会抛出UnauthorizedException授权失败异常。

 

github地址

https://github.com/cmniefei/shiroparent

 

作者:nfcm
qq讨论群:313032825
如果你觉得文章对你有用,不妨点下右下角的推荐按钮。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。https://www.cnblogs.com/nfcm/p/9875657.html
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信