java - 关于shiro在spring boot下自动登录的问题?
问题描述
我想实现shiro rememberMe之后,再次访问后自动登录并把一些用户信息再存入session
我现在是按照http://blog.csdn.net/Q_AN1314...这篇文章,写了一个过滤器,但是在过滤器里获取subject时出现错误
org.apache.shiro.UnavailableSecurityManagerException: No SecurityManager accessible to the calling code, either bound to the org.apache.shiro.util.ThreadContext or as a vm static singleton. This is an invalid application configuration.
这是过滤器
public class AddPrincipalToSessionFilter extends OncePerRequestFilter { @Resource private ManagerService managerService; @Override protected void doFilterInternal(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {Subject subject = SecurityUtils.getSubject();if (subject.isRemembered()) { String principal = (String) subject.getPrincipal(); Manager manager = managerService.queryManager(principal); //将用户信息存入session ContextHelper.saveLoginUserInfoToSeesion(manager);}filterChain.doFilter(servletRequest, servletResponse); }}
这是shiroFilter
@Bean @Autowired public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();// 必须设置 SecurityManagershiroFilterFactoryBean.setSecurityManager(securityManager);Map<String, Filter> filters = shiroFilterFactoryBean.getFilters();//获取filtersfilters.put('authc', new CustomFormAuthenticationFilter());//验证码过滤器filters.put('addPrincipal', addPrincipalToSessionFilter());//rememberMe存session过滤器//拦截器.Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();//配置退出过滤器,其中的具体的退出代码Shiro已经替我们实现了filterChainDefinitionMap.put('/logout', 'logout');filterChainDefinitionMap.put('/favicon.ico', 'anon');filterChainDefinitionMap.put('/js/**', 'anon');filterChainDefinitionMap.put('/css/**', 'anon');filterChainDefinitionMap.put('/img/**', 'anon');filterChainDefinitionMap.put('/fonts/**', 'anon');filterChainDefinitionMap.put('/icons/**', 'anon');filterChainDefinitionMap.put('/error/**', 'anon');filterChainDefinitionMap.put('/validateCode', 'anon');//配置记住我或认证通过可以访问的地址filterChainDefinitionMap.put('/', 'addPrincipal,user');filterChainDefinitionMap.put('/index', 'addPrincipal,user');filterChainDefinitionMap.put('/index.html', 'addPrincipal,user');//<!-- 过滤链定义,从上向下顺序执行,一般将 /**放在最为下边//<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->filterChainDefinitionMap.put('/**', 'authc');shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);// 如果不设置默认会自动寻找Web工程根目录下的'/login.jsp'页面shiroFilterFactoryBean.setLoginUrl('/login.html');// 登录成功后要跳转的链接shiroFilterFactoryBean.setSuccessUrl('/index.html');// 未授权要跳转的链接shiroFilterFactoryBean.setUnauthorizedUrl('/error/403');return shiroFilterFactoryBean; }}
请问一下大家这是怎么回事?或者大家有什么更好的实现方法请指教一下
问题解答
回答1:已解决 1.这个bean的注入一定要在shiroFilter下面
@Beanpublic AddPrincipalToSessionFilter addPrincipalToSessionFilter(){ return new AddPrincipalToSessionFilter();}
2.user要写在addPrincipal前面 filterChainDefinitionMap.put('/', 'user,addPrincipal');
相关文章:
1. java - ReentrantLock和Synchronized2. mysqli更新不了数据3. android - MVP模式 包的结构4. angular.js - 请教一个关于angularjs的小问题5. javascript - vue项目里的package.json6. Google App EngineJSP无法部署:java.lang.RuntimeException:无法获取系统Java编译器。请使用JDK,而不是JRE7. 如何解决docker宿主机无法访问容器中的服务?8. android - 离线地图的这种列表该怎么实现?9. mysql - sql 左连接结果union右连接结果,导致重复性计算怎么解决?10. python - django 按日归档统计订单求解
