使用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;
}
