shiro支持多个realm,当设置多个realm的时候,shiro的认证和授权的步骤是怎样的呢。

多个realm认证原理:

发现需要在执行认证的时候,需要策略来处理多个realm存在的情况。默认实现类有三个策略:

1. AtLeastOneSuccessfulStrategy :如果一个(或更多)Realm 验证成功,则整体的尝试被认为是成功的。如果没有一个验证成功,则整体尝试失败。

2. FirstSuccessfulStrategy 只有第一个成功地验证的Realm 返回的信息将被使用。后面的realm会被忽略,如果一个都没有成功则失败。

3. AllSucessfulStrategy 为了整体的尝试成功,所有配置的Realm 必须验证成功。如果没有一个验证成功,则整体尝试失败。

ModularRealmAuthenticator 默认的是AtLeastOneSuccessfulStrategy

多个realm授权原理:

当shiro判断是否有对应的角色或者资源的时候,最底层是调用Authenticator的doAuthenticate方法。

下面是Authenticator的一个实现类(ModularRealmAuthenticator)当有多个realms的时候执行的步骤:

得到总结:只要有一个realm里面有这个角色或者资源就代表有这个权限

代码测试

1,新增一个realm2,无论如何都是通过的,返回的principal固定为test(自己可以根据业务需要,为当前登录的用户设置别的身份)

  1. public class MyRealm2 extends AuthorizingRealm {
  2.  
  3. //认证信息,
  4. @Override
  5. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
  6. UsernamePasswordToken upToken = (UsernamePasswordToken) token;
  7.  
  8. String password = new String(upToken.getPassword());
  9. //模拟用户名密码是否正确
  10. return new SimpleAuthenticationInfo("test",password,getName());
  11.  
  12. }
  13.  
  14. //授权
  15. @Override
  16. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
  17. //获取用户名
  18. String username = (String)getAvailablePrincipal(principals);
  19. //模拟从数据库查询出来对应的角色和权限
  20. Set<String> roles = new HashSet<String>();
  21. roles.add("role_3");
  22. roles.add("role_4");
  23.  
  24. Set<String> permissions = new HashSet<String>();
  25. permissions.add("user:update");
  26.  
  27. SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
  28. info.setRoles(roles);
  29. info.setStringPermissions(permissions);
  30. return info;
  31. }

2配置文件

  1. myrealm=com.nfcm.shiro.Realm.MyRealm
  2. myrealm2=com.nfcm.shiro.Realm.MyRealm2
  3. #设置策略,必须所有的realm都通过
  4. authcStrategy=org.apache.shiro.authc.pam.AllSuccessfulStrategy
  5. #配置认证器
  6. authenticator=org.apache.shiro.authc.pam.ModularRealmAuthenticator
  7. #将验证器和策略关联起来
  8. authenticator.authenticationStrategy=$authcStrategy
  9. #注入认证器
  10. securityManager.authenticator=$authenticator
  11. #设置realm,这个要最后设置,如果后设置认证器或者授权器,则里面的realms都是空的
  12. securityManager.realms=$myrealm,$myrealm2

3.测试代码

  1. ShiroUtils.login("classpath:shiro-myrealm2.ini","zhang","123456");
  2.  
  3. Subject subject = SecurityUtils.getSubject();
  4.  
  5. List<String> principals =subject.getPrincipals().asList();
  6. for (String principal:principals) {
  7. System.out.println(principal);
  8. }
  9.  
  10. System.out.println(subject.getPrincipals().getPrimaryPrincipal());
  11. //是否通过认证
  12. System.out.println(subject.isAuthenticated());
  13. //是否有role1角色
  14. System.out.println(subject.hasRole("role_1"));
  15. //realm2里面的角色
  16. System.out.println(subject.hasRole("role_3"));
  17.  
  18. System.out.println(subject.isPermitted("user:create"));
  19. //realm2里面的资源
  20. System.out.println(subject.isPermitted("user:update"));

最后输出结果:

zhang
test
zhang
true
true
true
true
true

getPrimaryPrincipal方法获取的是第一个realm里面的身份。

subject.getPrincipals().fromRealm("myrealm2")可以获取指定的realm里面的身份信息,返回的是一个集合,获取第一个即可。

github代码地址

https://github.com/cmniefei/shiroparent

(4)shiro多个realm的更多相关文章

  1. shiro中自定义realm实现md5散列算法加密的模拟

    shiro中自定义realm实现md5散列算法加密的模拟.首先:我这里是做了一下shiro 自定义realm散列模拟,并没有真正链接数据库,因为那样东西就更多了,相信学到shiro的人对连接数据库的一 ...

  2. 【三】shiro入门 之 Realm

    Realm:域,Shiro 从从Realm获取安全数据(如用户.角色.权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法:也 ...

  3. Shiro -- (三) 自定义Realm

    简介: Realm:域,Shiro 从从 Realm 获取安全数据(如用户.角色.权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定 ...

  4. shiro(二)自定义realm,模拟数据库查询验证

    自定义一个realm类,实现realm接口 package com; import org.apache.shiro.authc.*; import org.apache.shiro.realm.Re ...

  5. 使用Spring配置shiro时,自定义Realm中属性无法使用注解注入解决办法

    先来看问题    纠结了几个小时终于找到了问题所在,因为shiro的realm属于Filter,简单说就是初始化realm时,spring还未加载相关业务Bean,那么解决办法就是将springmvc ...

  6. shiro之自定义realm

    Shiro认证过程 创建SecurityManager--->主体提交认证--->SecurityManager认证--->Authenticsto认证--->Realm验证 ...

  7. 6、Shiro之自定义realm

    1.创建一个包存放我们自定义的realm文件: 创建一个类名为CustomRealm继承AuthorizingRealm并实现父类AuthorizingRealm的方法,最后重写: CustomRea ...

  8. shiro权限认证Realm的四大用法

    一.SimpleAccountRealm public class AuthenticationTest {          SimpleAccountRealm sar=new SimpleAcc ...

  9. Shiro探索1. Realm

    1. Realm 是什么?汉语意思:领域,范围:王国:这个比较抽象: 简单一点就是:Realm 用来对用户进行认证和角色授权的 再简单一点,一个用户怎么判断它有没有登陆?这个用户是什么角色有哪些权限? ...

随机推荐

  1. vue-cli 中的静态资源处理

    你会注意到在项目结构上我们有静态资源两个目录:src/assets 和 static/.它们之间有什么区别? 1. 通过webpack处理的资源 要回答这个问题,我们首先需要了解webpack如何处理 ...

  2. HTTP报头:通用报头,请求报头,响应报头和实体报头

    缓存控制优先级从高到低分别是Pragma -> Cache-Control -> Expires 报头 每一个报头都是由 [名称 + ":" + 空格 + 值 + ] ...

  3. linux ping报错Name or service not known

    ubuntu设置静态ip以后忘记设置dns,ping的时候报错:Name or service not known 添加dns即可 vi /etc/resolv.conf nameserver 8.8 ...

  4. POJ2228 Naptime

    题目:http://poj.org/problem?id=2228 环形dp.开一维记录当前最后一份时间是否在睡.很精妙地分两类. 1.正常从1到n线性dp. 2.上边只有一种情况未覆盖:第一份时间就 ...

  5. 【jmeter】jmeter之-断言和检查点

    断言就类似LoadRunner中的检查点.对上一个请求返回的信息,做字符串.数据包大小.HTML.XML.图片等做判断,确保返回的信息的准确性. 简单的来理解一下,上一章讲到,我们对用户名和密码进行了 ...

  6. Bootstrap-CSS:网格系统

    ylbtech-Bootstrap-CSS:网格系统 1.返回顶部 1. Bootstrap 网格系统 本章节我们将讲解 Bootstrap 的网格系统(Grid System). Bootstrap ...

  7. [转]嵌入字体到程序 Winform C#

    http://www.cnblogs.com/top5/archive/2011/06/20/2084942.html 程序安装字体或直接调用非注册字体[c#] .安装字体 //程序直接将字体文件安装 ...

  8. java-appium-527手机浏览器、PC端程序、grid模式

    1.手机浏览器 2.window通用成语自动化 3.appium支持grid模式

  9. Windows Event 事件

    事件对象就像一个开关:它只有两种状态(开和关). 开状态:我们称其为“有信号” 关状态:我们称其为“无信号” 可以在一个线程的执行函数中创建一个事件对象,然后观察它的状态,如果是“无信号”就让该线程睡 ...

  10. guess_age

    age_shanshan = 18count = 3num = 0while num < count: age = int(input("age:")) if age == ...