前言
在shiro整合token实现续签的时候,调试发现了一个奇葩的情况,我的doGetAuthorizationInfo重复执行2次。
一、问题
问题1:doGetAuthorizationInfo重复执行2次。
问题2:关闭shiro自带的session
二、解决
解决1:
通过查找,只要注释掉defaultAdvisorAutoProxyCreator
和lifecycleBeanPostProcessor
这两个shiro注解的方法就可以。
/**
* 开启Shiro注解支持(例如@RequiresRoles()和@RequiresPermissions())
* shiro的注解需要借助Spring的AOP来实现
*/
// @Bean
// @DependsOn("lifecycleBeanPostProcessor")
// public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
// DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
// defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
// return defaultAdvisorAutoProxyCreator;
// }
//
// @Bean
// public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
// return new LifecycleBeanPostProcessor();
// }
/**
* 开启Shiro-aop注解支持
* 使用代理方式所以需要开启代码支持
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
- 疑惑:明明这个是开启Shiro注解支持(例如@RequiresRoles()和@RequiresPermissions()),如果注释掉的话,那不就不能用这个判断权限的注解了吗?但注释掉这注解支持后,依然可以使用@RequiresRoles()和@RequiresPermissions()😑
- 回答:根据查找最后找到了一个大佬的回答,虽然不能说完全一样,但也是一个参考的思路https://segmentfault.com/q/1010000014766223
PS:不管咋样,就使用而言,问题不大👀。
解决2:
在安全管理器securityManager中加上 关闭shiro自带的session 的代码即可。【Ctrl CV使用】
/**
* 安全管理器
* 它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组件实例,
* 并通过它来提供安全管理的各种服务
*/
@Bean("securityManager")
public DefaultWebSecurityManager securityManager(ShiroRealm myRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 自定义Realm验证,这个Realm是最终用于完成我们的认证和授权操作的具体对象
securityManager.setRealm(myRealm);
/*
* 关闭shiro自带的session,详情见文档
* http://shiro.apache.org/session-management.html#SessionManagement-StatelessApplications%28Sessionless%29
*/
DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();
DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator();
defaultSessionStorageEvaluator.setSessionStorageEnabled(false);
subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator);
securityManager.setSubjectDAO(subjectDAO);
return securityManager;
}