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

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

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

校验权限代码

在classpath下新建shiro-role.ini文件,内容如下:

代表有一个zhang的用户,拥有role1角色(如果有多个角色,后面用逗号继续隔开role1,role2)

role1这个角色有两个资源,分别是user:create和user:update。

[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。

身份和凭证

在登陆中,用户需要提供principals(身份)和credentials(证明/凭证)提供给shiro来进行认证和授权。

principals可以有多个身份,但是只能有一个Primary principals,一般是登录账号,比如手机号。

credentials一般是密码。

在UsernamePasswordToken的账户密码就对应着身份和凭证。

subject.login()原理

当执行subject.login的时候,实际调用的是securityManager所属的Authenticator(默认是ModularRealmAuthenticator)的doAuthenticate方法进行验证。

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

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

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

subject.checkRole原理

当用户调用subject.checkRole("role1")判断用户是否有对应的角色的时候,底层还是走的SecurityManager所属的Authorizer的checkRole方法。

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

(2)shiro角色资源权限的更多相关文章

  1. SpringSecurity 自定义用户 角色 资源权限控制

    SpringSecurity 自定义用户 角色 资源权限控制 package com.joyen.learning.security; import java.sql.ResultSet; impor ...

  2. shiro 角色与权限的解读

    1.为什么 shiro 有了<角色>后,还要设置<角色权限>呢?(问题) 思考:设置好角色了,那么就代表什么操作都可以执行了吗? 理解:如果上边回答是的话,那么只是<角色 ...

  3. SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建

    SpringBoot整合Shiro实现基于角色的权限访问控制(RBAC)系统简单设计从零搭建 技术栈 : SpringBoot + shiro + jpa + freemark ,因为篇幅原因,这里只 ...

  4. 使用 Shiro 设计基于用户、角色、权限的通用权限管理系统

    一.前言 在大型的信息管理系统中,经常涉及到权限管理系统 下面来个 demo,很多复杂的系统的设计都来自它 代码已经放到github上了,地址:https://github.com/larger5/s ...

  5. spring boot shiro redis整合基于角色和权限的安全管理-Java编程

    一.概述 本博客主要讲解spring boot整合Apache的shiro框架,实现基于角色的安全访问控制或者基于权限的访问安全控制,其中还使用到分布式缓存redis进行用户认证信息的缓存,减少数据库 ...

  6. Spring security 用户,角色,权限,资源

    转自:http://blog.csdn.net/wybqq/article/details/52940194 关于Spring security对用户请求的处理过程 体现在这两个过程的体现. 关于用户 ...

  7. Spring+shiro配置JSP权限标签+角色标签+缓存

    Spring+shiro,让shiro管理所有权限,特别是实现jsp页面中的权限点标签,每次打开页面需要读取数据库看权限,这样的方式对数据库压力太大,使用缓存就能极大减少数据库访问量. 下面记录下sh ...

  8. Shiro系列(0) - 权限管理在J2EE企业级开发中的应用与实战

    其实也是应大家要求,讲一下权限管理,之前有讲过,但是没有拿出来细讲,这次索性录了视频从头到尾把shiro讲一遍.后续spring security会另外找个时间也讲一下. 主要内容会包括以下 1.了解 ...

  9. shiro实现动态权限管理

    用到shiro框架实现权限控制时,根据实际要求,权限在数据库增删改后都要把权限过滤链变化实时更新到服务器中. 1.配置文件里配置的filterchains都是静态的,但实际开发中更多的是从数据库中动态 ...

随机推荐

  1. map的put和putIfAbsent使用

    源码中传入key和value,根据key获取看是否存在value,如果value==null,然后调用put方法把传入的key和value  put进map,返回根据key获取的老value 意思就是 ...

  2. JS Web的Flex弹性盒子模型

    1. justify-content <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  3. 2018-2019学年第一学期Java课设--魔塔

    目录 Magic-Towers 一.团队名称.团队成员介绍.任务分配 团队名称:MoTa 团队成员介绍 任务分配 二.项目简介 三.项目采用技术 四.项目亮点 主界面显示主要信息功能 游戏动画 五.项 ...

  4. 杂项:BugFree

    ylbtech-杂项:BugFree BugFree是借鉴微软的研发流程和Bug管理理念,使用PHP+MySQL独立写出的一个Bug管理系统.简单实用.免费并且开放源代码(遵循GNU GPL). 命名 ...

  5. MariaDB管理系统

    MariaDB管理系统 [root@c4kaichen@163 ~]# yum install mariadb[root@c4kaichen@163 ~]# yum install -y mariad ...

  6. 每秒查询率QPS

    每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量. 原理:每天80%的访问集中在20%的时间里,这20%时 ...

  7. [UE4]C++实现动态加载UObject:StaticLoadObject();以Texture和Material为例

    相关内容: C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>() http://aigo.iteye.com/blog/2281558C++静 ...

  8. Oracle中分页查询和联表查询

    1.使用ROWNUM伪列查询 1.1.查询十条数据(rownum<=n) SELECT ROWNUM,A.* FROM v_sjjx_unit_info A WHERE ROWNUM<=1 ...

  9. 一篇文章让你入门Shell !

    Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合. Shell可以直接使用在win/Unix/Linux上面 ...

  10. SQL Server2016 配置管理器

    SQL Server2016 以后版本配置管理器的配置管理器不再同数据库工具集成,是单独的应用. Windows 10: 要打开 SQL Server 配置管理器,请在“起始页”中键入 SQLServ ...