CAS+Shiro 自定义 pac4jRealm 每次判断权限都要重复执行doGetAuthorizationInfo()两次
代码如下:
public class UserRealm extends Pac4jRealm(){
@Override
public AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// TODO Auto-generated method stub
System.out.println("Onece");
Set<String> roles=new HashSet()<>;
roles.add("admin");
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
authorizationInfo.setRoles(roles);
return authorizationInfo ;
}
在controller层有一个方法
@RequestMapping("/hello2")
@ResponseBody
public String hello2() {
SecurityUtils.getSubject().checkRoles("user");
return "success";
}
当执行chekRoles 执行了doGetAuthorizationInfo() 方法 但是要打印两个"Onece" 请问这是什么原因呢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
很抱歉 现在才来给出问题答案(仅代表本人观点 错误请指正) 我的观点不一定是对的 仅供参考:
这个问题其实换一个标题问题更清晰:即是 Spring Aop注解执行两次 方法体执行一次!!!
在我的业务场景中 使用CGLIB动态代理 通过DynamicAdvisedInterceptor来处理 intercept是aop处理入口:
包含四个参数 第一个是代理方法 第二个是目标方法 第三个是方法参数 第四个是方法代理信息
通过打断点发现了bug出现的原因:
第一次执行时 代理方法和目标方法 是同一个!!!
第二次执行时 目标方法才是真正的方法体!!!
当前我的pub-shiro项目依赖了 pub-datasource模块 pub-datasource模块里面使用了
使用了cglib代理 而后在shiroConfig中 注入了DefaultAdvisorAutoProxyCreator代理器 存在了两个代理器 这两个代理器的区别和为什么出现该问题的原因 我还在研究中 得出答案会来更新
本问题即是Spring Aop注解执行两次 方法体执行一次!!! 代理1 代理 代理2 而 代理2 代理 真正的方法体!!! 这也就是为什么shiro中 权限校验方法执行两次 而真正的方法体执行一次的原因
看一下是不是配置了DefaultAdvisorAutoProxyCreator,我按照网上的说法配置,也是会调用两次doGetAuthorizationInfo() 方法,去掉DefaultAdvisorAutoProxyCreator的Bean定义就正常了。你可以试一下!!!!!
我也是执行两次,请问解决了么?