springboot shiro 自定义filter调用SecurityUtils.getSubject()报UnavailableSecurityManagerException

框架简述:springboot+shiro

问题简述:自定义filter中要调用session存储数据,供后续方法调用。

SecurityUtils.getSubject().getSession()报UnavailableSecurityManagerException

处理方法备忘:

CorsFilter即为自定义的filter

CorsFilter要在shirofilter之后调用即可。

public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
   System.out.println("ShiroConfiguration.shirFilter()");
   ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
   Map<String, Filter> filters = shiroFilterFactoryBean.getFilters();//获取filters
   filters.put("authc", new MyShiroSessionFilter());//将自定义 的FormAuthenticationFilter注入shiroFilter中
   //定义CorsFilter 在shirosessionfilter 之后
   filters.put("corsFilter",new CorsFilter());
   shiroFilterFactoryBean.setSecurityManager(securityManager);
   //拦截器.
   Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();
   // 配置不会被拦截的链接 顺序判断
   filterChainDefinitionMap.put("/static/**", "anon");
   filterChainDefinitionMap.put("/css/**", "anon");
   filterChainDefinitionMap.put("/js/**", "anon");
   filterChainDefinitionMap.put("/fonts/**", "anon");
   filterChainDefinitionMap.put("/images/**", "anon");

   //配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了
   filterChainDefinitionMap.put("/logout", "logout");
   //<!-- 过滤链定义,从上向下顺序执行,一般将/**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;
   //<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
   filterChainDefinitionMap.put("/**", "authc");
   filterChainDefinitionMap.put("/views/*", "corsFilter");
   //yours51 登陆入口
   shiroFilterFactoryBean.setLoginUrl("/login");
   // 登录成功后要跳转的链接
   shiroFilterFactoryBean.setSuccessUrl("/index");
   shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
   return shiroFilterFactoryBean;
}

猜你喜欢

转载自blog.csdn.net/qq_32507509/article/details/85614218