想看多realm认证的请看

https://blog.csdn.net/u013294097/article/details/90053299

多Realm分别授权需要重写

import org.apache.shiro.authz.ModularRealmAuthorizer;

的三个方法:

public boolean isPermitted(PrincipalCollection principals, String permission);public boolean isPermitted(PrincipalCollection principals, Permission permission);public boolean hasRole(PrincipalCollection principals, String roleIdentifier);

思路:

多Realm的每个Realm都设置一个名字,这样子,在鉴权的时候拿到名字,确定使用哪个Realm进行授权

1.为Realm设置名字代码:

public class AdminRealm extends AuthorizingRealm {@Referenceprivate IAdminAuthService adminAuthService;private static final String ADMIN_LOGIN_TYPE = LoginType.ADMIN.getName();{super.setName("admin");//设置realm的名字,非常重要}@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {return null;}@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {return null;}
}

2.复写import org.apache.shiro.authz.ModularRealmAuthorizer;方法,实现三个接口

import com.cyjz.util.CommUtil;
import org.apache.shiro.authz.Authorizer;
import org.apache.shiro.authz.ModularRealmAuthorizer;
import org.apache.shiro.authz.Permission;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.subject.PrincipalCollection;import java.util.Set;public class CustomizedModularRealmAuthorizer extends ModularRealmAuthorizer {@Overridepublic boolean isPermitted(PrincipalCollection principals, String permission) {assertRealmsConfigured();Set<String> realmNames = principals.getRealmNames();//获取realm的名字String realmName = realmNames.iterator().next();for (Realm realm : getRealms()) {if (!(realm instanceof Authorizer)) continue;//匹配名字if(realmName.equals("admin"))) {if (realm instanceof AdminRealm) {return ((AdminRealm) realm).isPermitted(principals, permission);}}if(realmName.equals("user")) {if (realm instanceof UserRealm) {return ((UserRealm) realm).isPermitted(principals, permission);}}}return false;}@Overridepublic boolean isPermitted(PrincipalCollection principals, Permission permission) {assertRealmsConfigured();Set<String> realmNames = principals.getRealmNames();//获取realm的名字String realmName = realmNames.iterator().next();for (Realm realm : getRealms()) {if (!(realm instanceof Authorizer)) continue;//匹配名字if(realmName.equals("admin"))) {if (realm instanceof AdminRealm) {return ((AdminRealm) realm).isPermitted(principals, permission);}}//匹配名字if(realmName.equals("user"))) {if (realm instanceof UserRealm) {return ((UserRealm) realm).isPermitted(principals, permission);}}}return false;    }@Overridepublic boolean hasRole(PrincipalCollection principals, String roleIdentifier) {assertRealmsConfigured();Set<String> realmNames = principals.getRealmNames();//获取realm的名字String realmName = realmNames.iterator().next();for (Realm realm : getRealms()) {if (!(realm instanceof Authorizer)) continue;//匹配名字if(realmName.equals("admin"))) {if (realm instanceof AdminRealm) {return ((AdminRealm) realm).hasRole(principals, roleIdentifier);}}//匹配名字if(realmName.equals("admin"))) {if (realm instanceof UserRealm) {return ((UserRealm) realm).hasRole(principals, roleIdentifier);}}}return false;}
}

我这里使用的是springboot,需要在shiroconfig里面的securityManager添加进这个自定义的CustomizedModularRealmAuthorizer

    @Beanpublic DefaultWebSecurityManager securityManager(UserRealm customRealm, AdminRealm adminRealm, DefaultWebSessionManager sessionManager) {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();List<Realm> realms = new ArrayList<>();realms.add(customRealm);realms.add(adminRealm);securityManager.setRealms(realms);securityManager.setSessionManager(sessionManager);securityManager.setCacheManager(new RedisCacheManager());//====================多realm授权核心代码===================CustomizedModularRealmAuthorizer authorizer = new CustomizedModularRealmAuthorizer();authorizer.setRealms(realms);securityManager.setAuthorizer(authorizer);//====================多realm授权核心代码===================return securityManager;}

如果觉得本文对您有所帮助,欢迎您扫码下图所示的支付宝和微信支付二维码对本文进行随意打赏。您的支持将鼓励我继续创作

shiro多Realm分别授权相关推荐

  1. Shiro验证策略-shiro自定义实现Realm来实现身份验证-shiro散列加密算法-shiro授权-shiro自定义Realm实现授权

    Shiro验证策略 Authentication Strategy:认证策略,在shiro中有三种认证策略: AtleastOneSuccessfulStrategy[默认] 如果一个或多个Realm ...

  2. 项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示...

    1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...

  3. shiro受权时没有走对应的realm的授权解决方案

    毕设使用shiro授权时遇到认证时没有走对应的realm,先直接说解决方案:新建 UserModularRealmAuthorizer 类继承org.apache.shiro.authz.Modula ...

  4. Shiro框架:授权流程、授权方式、Shiro授权入门程序、自定义Realm进行授权

    一.Shiro授权: 1.授权与权限: (1)授权:访问控制,必须具有该资源的访问权限才可以访问该资源. (2)权限模型:标准权限数据模型包括 :用户.角色.权限(包括资源和权限).用户角色关系.角色 ...

  5. shiro自定义Realm

    1.1 自定义Realm 上边的程序使用的是shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm. ...

  6. authc过滤器 shiro_使用Shiro实现认证和授权(基于SpringBoot)

    Apache Shiro是一个功能强大且易于使用的Java安全框架,它为开发人员提供了一种直观,全面的身份验证,授权,加密和会话管理解决方案.下面是在SpringBoot中使用Shiro进行认证和授权 ...

  7. BOS12——多对多添加方法,多对多页面需要字段问题(不多的话直接提供get方法),修改Realm中授权方法(查询数据库),缓存Java对象的方法,加载左侧菜单(ztree提供pId)...

    1.多对多添加方法 @Override public void add(Role model, String functionIds) {// 1.先将角色保存到数据库roleDao.save(mod ...

  8. Shiro系列-Shiro中Realm如何使用

    导语   之前的分享中,了解到了用户身份认证,在说用户认证的时候提到了一个概念就是Realm,在之前的入门分享中提到了,Realm其实就是一个安全数据源,那么怎么样使用这个安全数据源呢?下面就来一起研 ...

  9. 从实例入手学习Shiro自定义Realm实现查询数据进行验证

    场景 从实例入手学习Shiro与Web的整合: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/90140802 在上面已经实现整合 ...

最新文章

  1. 核酸序列特征信息分析
  2. BZOJ 4103 [Thusc 2015]异或运算 (可持久化01Trie+二分)
  3. 为什么需要超过48k的采样音频?
  4. linux java 获取路径怎么写_linux中java获取路径怎么写?
  5. 95-190-442-源码-window-Trigger-ProcessingTimeTrigger
  6. html5,用或不用,它都在那里
  7. B - I Hate It(单点更新)(区间求最大值)
  8. 大M单纯形算法的MATLAB实现
  9. Python数据处理039:数据分析之csv文件
  10. 通过锂电池原理来设计BMS系统
  11. 调用Android自带浏览器打开网页
  12. android的sd卡分区,超强Android系统SD卡分区教程!
  13. 跟铁拐李李老师学习工作流的第二天
  14. flash 的鼠标事件详解
  15. Python实现将多张图片拼接为一张
  16. 家用计算机按键不灵怎么修,电脑键盘两个ctrl键失灵怎么回事?ctrl键失灵的修复方法...
  17. 使用 Fastlane 上传 App 到蒲公英
  18. 打破行业困境,大麦如何引领NB-IoT技术的创新应用
  19. 英飞凌——飞行时间的工作原理是什么
  20. 统计学中的标准差(SD)和 平均值的标准误差(SEM)的区别

热门文章

  1. 腾讯数据库专家多年运维经验凝聚成简,总结这份595页工作笔记
  2. cpython和jpython_在J内部使用Python
  3. 对php程序的理解,小魏谈对于php程序的理解
  4. 消息推送服务器令牌,小程序-消息推送配置Token令牌错误校验失败如何解决
  5. ZooKeeper的安装及部署
  6. 0423-mysql查询语句大全
  7. 将ubuntu的apache2修改成https链接
  8. Qt学习之路1---软件下载安装及工程简介
  9. 第五周项目3-用多文件组织多个类的程序
  10. opencv1-安装及资料