shiro受权时没有走对应的realm的授权解决方案
毕设使用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、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示...
1 课程计划 1. 常见权限控制方式 2. 基于shiro提供url拦截方式验证权限 3. 在realm中授权 4. 基于shiro提供注解方式验证权限 5. 总结验证权限方式(四种) 6. 用户注销 ...
- shiro认证时出现报错Submitted credentials for token [org.apache.shiro.authc.UsernamePasswordToken -
shiro认证时出现报错: org.apache.shiro.authc.IncorrectCredentialsException: Submitted credentials for token ...
- Shiro验证策略-shiro自定义实现Realm来实现身份验证-shiro散列加密算法-shiro授权-shiro自定义Realm实现授权
Shiro验证策略 Authentication Strategy:认证策略,在shiro中有三种认证策略: AtleastOneSuccessfulStrategy[默认] 如果一个或多个Realm ...
- Shiro框架:授权流程、授权方式、Shiro授权入门程序、自定义Realm进行授权
一.Shiro授权: 1.授权与权限: (1)授权:访问控制,必须具有该资源的访问权限才可以访问该资源. (2)权限模型:标准权限数据模型包括 :用户.角色.权限(包括资源和权限).用户角色关系.角色 ...
- shiro多Realm分别授权
想看多realm认证的请看 https://blog.csdn.net/u013294097/article/details/90053299 多Realm分别授权需要重写 import org.ap ...
- BOS12——多对多添加方法,多对多页面需要字段问题(不多的话直接提供get方法),修改Realm中授权方法(查询数据库),缓存Java对象的方法,加载左侧菜单(ztree提供pId)...
1.多对多添加方法 @Override public void add(Role model, String functionIds) {// 1.先将角色保存到数据库roleDao.save(mod ...
- [ c++] cmake 编译时 undefined reference to `std::cout‘ 错误的解决方案
[ c++] cmake 编译时 undefined reference to `std::cout' 错误的解决方案 参考文章: (1)[ c++] cmake 编译时 undefined refe ...
- 安装TensorFlow时出现ERROR: Cannot uninstall ‘wrapt‘问题的解决方案
安装TensorFlow时出现ERROR: Cannot uninstall 'wrapt'问题的解决方案 参考文章: (1)安装TensorFlow时出现ERROR: Cannot uninstal ...
- 安装完Pycharm,启动时碰到“failed to load jvm dll“的解决方案
安装完Pycharm,启动时碰到"failed to load jvm dll"的解决方案 参考文章: (1)安装完Pycharm,启动时碰到"failed to loa ...
最新文章
- 2022-2028年中国钢铁电商产业竞争现状及发展前景预测报告
- 竞赛 | 上汽拿出了2000辆车的真实数据集,千万级投资+直接录用机会等你来战!...
- Android第三十三天
- 互换性与技术测量电子版_181套建设工程全套资料表格,从开工到完工,完整电子版手慢无...
- Java快速排序的调试
- 嘉年华回顾丨 杨长老带你解密 Oracle 19c 和 20c 的新特性
- SpringBoot整合freemarker找不到静态资源ftl文件解决办法
- Q90:简易地模拟透明材质(Simple Transparency)
- 相机姿态估计(五)--DLS
- tcp_nodelay memcached java_spymemcached 的 useNagle 问题与 TCP/IP延迟发送数据
- 步进电机正反转实验_三相异步电机正反转控制原理图
- 简历javaweb项目描述怎么写_从事java开发工作简历怎样写工作描述
- 三招解决!电脑密码忘记了怎么办?新手都能学会
- 【python爬虫】每日获取强智教务系统课表,并发送短信到学生手机
- Java fx 变速播放音乐_QVE音频剪辑如何调整音频播放速度?音乐变速方法说明
- android studio 倒计时,Android studio 学习3:实现倒计时、画板
- textarea回车换行的方法
- 视频无损编辑、截取工具
- 微信小程序 瀑布流布局 终极解决方案
- HTML作业之粉粉滴个人博客来袭—篇章一