使用shiro时,如果正常登陆(执行subject.login(token)成功)就能在全局通过SecurityUtils.getSubject().getPrincipal()获取用户信息。
之前的项目是OK的,新项目中突然出问题。现在给出我自己问题的解决方案。
shiro的配置中有个use-prefix选项,其配置有两点需要注意:
要在配置文件的最上边(或者相关属性的最前边);
一定要先于其它相关配置生效。
我原先的配置文件中的部分内容如下:
@Configuration
public class ShiroConfig {
@Autowired
private ManagerAccessControlFilter managerAccessControlFilter;
@Bean
public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
@Bean
public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator(){
DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator=new DefaultAdvisorAutoProxyCreator();
defaultAdvisorAutoProxyCreator.setUsePrefix(true);
return defaultAdvisorAutoProxyCreator;
}
我的filter是通过spring注解引用的,而且配置是在setUsePrefix前(这个时候这个倒是其次,即使放前边也是不生效的)。
如果使用spring的注解,在进入配置文件前肯定是优先被加载的。所以将其更改如下:
@Bean
public static LifecycleBeanPostProcessor getLifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
@Bean
public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator(){
DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator=new DefaultAdvisorAutoProxyCreator();
defaultAdvisorAutoProxyCreator.setUsePrefix(true);
return defaultAdvisorAutoProxyCreator;
}
/**
* ShiroFilterFactoryBean 处理拦截资源文件问题。
* 注意:单独一个ShiroFilterFactoryBean配置是或报错的,因为在
* 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager
*
Filter Chain定义说明
1、一个URL可以配置多个Filter,使用逗号分隔
2、当设置多个过滤器时,全部验证通过,才视为通过
3、部分过滤器可指定参数,如perms,roles
*
*/
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
// 必须设置 SecurityManager
shiroFilterFactoryBean.setSecurityManager(securityManager);
ManagerAccessControlFilter managerAccessControlFilter = new ManagerAccessControlFilter();
//自定义拦截器
Map<String, Filter> filtersMap = new LinkedHashMap<>();
filtersMap.put("managerAccessControlFilter", managerAccessControlFilter);
shiroFilterFactoryBean.setFilters(filtersMap);
//拦截器
Map<String,String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/ping", "anon");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}
使用shiro时,如果正常登陆(执行subject.login(token)成功)就能在全局通过SecurityUtils.getSubject().getPrincipal()获取用户信息。...
最新推荐文章于 2022-08-24 04:59:42 发布
本文介绍了一个关于Shiro框架在Spring环境下配置时遇到的问题及解决方案。主要问题是由于配置顺序不当导致无法通过SecurityUtils获取到登录用户的主体信息。通过调整配置顺序,确保use-prefix配置优先生效,解决了该问题。
3633

被折叠的 条评论
为什么被折叠?



