毕设使用shiro授权时遇到认证时没有走对应的realm,先直接说解决方案:新建 UserModularRealmAuthorizer 类继承org.apache.shiro.authz.ModularRealmAuthorizer,并重写认证方法,实现授权时控制走哪个realm。

   public SecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();//设置realm.securityManager.setAuthenticator(modularRealmAuthenticator());List<Realm> realms = new ArrayList<>();//添加多个Realmrealms.add(adminShiroRealm());realms.add(userShiroRealm());securityManager.setRealms(realms);return securityManager;}

这是我之前shiroConfig类的securityManager方法的代码,其中我先add的是adminShiroRealm(),导致了使用注解@RequiresRole开发时,不管是 @RequiresRoles(value = “user”),还是 @RequiresRoles(value = “admin”),授权都是先走的adminShiroRealm(),因为先add的是adminShiroRealm()。这就是问题的根源。
自定义UserModularRealmAuthorizer

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;public class UserModularRealmAuthorizer extends ModularRealmAuthorizer {@Overridepublic boolean hasRole(PrincipalCollection principals, String roleIdentifier) {assertRealmsConfigured();// 所有RealmCollection<Realm> realms = getRealms();HashMap<String, Realm> realmHashMap = new HashMap<>(realms.size());for (Realm realm : realms) {if (realm.getName().contains("Admin")) {realmHashMap.put("AdminShiroRealm", realm);} else if (realm.getName().contains("User")) {realmHashMap.put("UserShiroRealm", realm);}}Set<String> realmNames = principals.getRealmNames();if (realmNames != null) {String realmName = null;Iterator it = realmNames.iterator();while (it.hasNext()) {realmName = ConvertUtils.convert(it.next());if (realmName.contains("Admin")) {return ((AdminShiroRealm) realmHashMap.get("AdminShiroRealm")).hasRole(principals,roleIdentifier);} else if (realmName.contains("User")) {return ((UserShiroRealm) realmHashMap.get("UserShiroRealm")).hasRole(principals,roleIdentifier);}break;}}return false;}
}

这里我只是重写了hasRole这个方法,具体还有很多方法,根据自己的需要和逻辑去实现就好。

重写shiroConfig类的securityManager方法

   @Beanpublic SecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();List<Realm> realms = new ArrayList<>();//添加多个Realm//注意这里要重新对于授权时进行控制的,使用资源注入时会发现,使用的是adminShiroRealm()的doGetAuthorizationInfo方法(因为admin添加在前),// 没有走对应的realm的授权,产生问题错乱,新建 org.apache.shiro.authz.ModularRealmAuthorizer子类realms.add(adminShiroRealm());realms.add(userShiroRealm());securityManager.setAuthorizer(modularRealmAuthorizer());//设置realm.securityManager.setAuthenticator(modularRealmAuthenticator()); securityManager.setRealms(realms);return securityManager;}

这样就能实现realm的授权控制了。

shiro受权时没有走对应的realm的授权解决方案相关推荐

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

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

  2. shiro认证时出现报错Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken -

    shiro认证时出现报错: org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token ...

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

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

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

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

  5. shiro多Realm分别授权

    想看多realm认证的请看 https://blog.csdn.net/u013294097/article/details/90053299 多Realm分别授权需要重写 import org.ap ...

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

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

  7. [ c++] cmake 编译时 undefined reference to `std::cout‘ 错误的解决方案

    [ c++] cmake 编译时 undefined reference to `std::cout' 错误的解决方案 参考文章: (1)[ c++] cmake 编译时 undefined refe ...

  8. 安装TensorFlow时出现ERROR: Cannot uninstall ‘wrapt‘问题的解决方案

    安装TensorFlow时出现ERROR: Cannot uninstall 'wrapt'问题的解决方案 参考文章: (1)安装TensorFlow时出现ERROR: Cannot uninstal ...

  9. 安装完Pycharm,启动时碰到“failed to load jvm dll“的解决方案

    安装完Pycharm,启动时碰到"failed to load jvm dll"的解决方案 参考文章: (1)安装完Pycharm,启动时碰到"failed to loa ...

最新文章

  1. 2022-2028年中国钢铁电商产业竞争现状及发展前景预测报告
  2. 竞赛 | 上汽拿出了2000辆车的真实数据集,千万级投资+直接录用机会等你来战!...
  3. Android第三十三天
  4. 互换性与技术测量电子版_181套建设工程全套资料表格,从开工到完工,完整电子版手慢无...
  5. Java快速排序的调试
  6. 嘉年华回顾丨 杨长老带你解密 Oracle 19c 和 20c 的新特性
  7. SpringBoot整合freemarker找不到静态资源ftl文件解决办法
  8. Q90:简易地模拟透明材质(Simple Transparency)
  9. 相机姿态估计(五)--DLS
  10. tcp_nodelay memcached java_spymemcached 的 useNagle 问题与 TCP/IP延迟发送数据
  11. 步进电机正反转实验_三相异步电机正反转控制原理图
  12. 简历javaweb项目描述怎么写_从事java开发工作简历怎样写工作描述
  13. 三招解决!电脑密码忘记了怎么办?新手都能学会
  14. 【python爬虫】每日获取强智教务系统课表,并发送短信到学生手机
  15. Java fx 变速播放音乐_QVE音频剪辑如何调整音频播放速度?音乐变速方法说明
  16. android studio 倒计时,Android studio 学习3:实现倒计时、画板
  17. textarea回车换行的方法
  18. 视频无损编辑、截取工具
  19. 微信小程序 瀑布流布局 终极解决方案
  20. HTML作业之粉粉滴个人博客来袭—篇章一

热门文章

  1. 5、【设计模式】单列模式
  2. 2018.09.01 独立集(树形dp)
  3. bzoj 5216 [Lydsy2017省队十连测]公路建设 线段树维护 最小生成树
  4. 用Python做自然语言处理必知的八个工具【转载】
  5. poj 1020 深搜
  6. 经典网页设计:20例与众不同的网页联系表单设计
  7. tomcat下list所有文件的目录
  8. 将keepalived添加到系统服务中
  9. 手把手实现YOLOv3(一)
  10. 函数名称前面加引用“”或指针符号“*”的意思