使用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;
}
将自定义的filter使用new生成,这样其被加载就会晚于use-proxy。
如果是在xml中配置的,一定要将use-proxy放到前面配置。