美文网首页
springboot 中 shiro 使用问题

springboot 中 shiro 使用问题

作者: 树蜂 | 来源:发表于2019-02-14 15:31 被阅读0次

    问题列表:

    1. 登录成功后没有跳到successUrl
    2. 执行登录后,总在登录页跳转
    3. 添加自定义filter后,默认filter不生效问题
    4. 在session中存储用户信息
    5. 设置session的过期时间
    6. 访问登录页面,如果已登录则跳转到主页

    问题1、登录成功后没有跳到successUrl

    原因:shiro去session中找出之前的保存的请求,如果没有的话才会跳转到我们配置的successUrl!详见 Shiro登录成功之后跳到指定URL
    解决:
    方法1、同Shiro登录成功之后跳到指定URL
    方法2、要跳转到主页,但实际跳转到根路径的情况

    @RequestMapping({"/", "/main"})
    

    问题2、执行登录后,总在登录页跳转

    原因:网页中已存在登录信息,不会执行realm的验证代码,因此不会跳转。
    解决:清除浏览器缓存信息即可。
    像谷歌或360浏览器,按ctrl+shift+del键调出清除对话框,清理如下内容


    image.png

    问题3、添加自定义filter后,默认filter不生效问题

    原因:springboot自动帮我们注册了自定义的Filter
    解决:

    @Configuration
    public class ShiroFilterRegisterConfig {
        @Bean
        public FilterRegistrationBean shiroLoginFilteRegistration(自定义Filter filter) {
            FilterRegistrationBean registration = new FilterRegistrationBean(filter);
            registration.setEnabled(false);
            return registration;
        }
        // 有其他的filter则依次写下来
    }
    

    参考

    问题4、在session中存储用户信息

    1. 在Realm的doGetAuthenticationInfo中,
    User _User;
    // 验证获取_User
    return new SimpleAuthenticationInfo(_User, pwd, getName());
    

    2、重写FormAuthenticationFilter

    public class CustomFormAuthenticationFilter extends FormAuthenticationFilter
    {
        @Override
        protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request,
                ServletResponse response) throws Exception
        {
            // 登陆成功后,将用户信息存入session
            User _User = (User)subject.getPrincipal();
            // 获取session
            HttpServletRequest httpServletRequest = WebUtils.toHttp(request);
            HttpSession session = httpServletRequest.getSession();
            // 把用户信息保存到session
            session.setAttribute("user", _User);
            return super.onLoginSuccess(token, subject, request, response);
        }
    }
    

    或者

    public class CustomFormAuthenticationFilter extends FormAuthenticationFilter
    {
        @Override
        protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request,
                ServletResponse response) throws Exception
        {
            // 登陆成功后,将用户信息存入session
            User _User = (User)subject.getPrincipal();
            Session session = subject.getSession();
            session.setAttribute("user", _User);
            return super.onLoginSuccess(token, subject, request, response);
        }
    }
    

    3、注入filter

        @Bean
        public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager)
        {
            ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
    
            // ----------------- 过滤器 ----------------- 
            Map<String, Filter> filterMap = shiroFilterFactoryBean.getFilters();
            filterMap.put("authc", formFilter());
            shiroFilterFactoryBean.setFilters(filterMap);
            // ...
        }
    
        @Bean
        public CustomFormAuthenticationFilter formFilter()
        {
            return new CustomFormAuthenticationFilter();
        }
    

    假若注入失败,请查看问题3

    问题5、设置session的过期时间

    设置全局的过期时间

    @Bean
        public SecurityManager securityManager()
        {
            System.out.println("--securityManager--");
            DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
            securityManager.setSessionManager(sessionManager());
            // 设置realm.
            securityManager.setRealm(myShiroRealm());
            return securityManager;
        }
        
        @Bean
        public DefaultWebSessionManager sessionManager() {
            DefaultWebSessionManager _SessionManager = new DefaultWebSessionManager();
            // 设置全局session过期时间
            // 单位毫秒,默认为3分钟
            _SessionManager.setGlobalSessionTimeout(1000 * 60 * 3);
            return _SessionManager;
        }
    

    设置某个用户的session的过期时间

    SecurityUtils.getSubject().getSession().setTimeout(1800000);
    

    6. 访问登录页面,如果已登录则跳转到主页

    其中User需要再返回SimpleAuthenticationInfo时注入

    @RequestMapping(value = "/login", method = RequestMethod.GET)
        public String login()
        {
            try
            {
                // session还存在,则跳转到主页
                Subject _Subject = SecurityUtils.getSubject();
                Session _Session = _Subject.getSession(false);
                if (_Session != null)
                {
                    User _User = (User)_Subject.getPrincipal();
                    if (_User != null)
                    {
                        // 转发或者重定向
    //                  return "forward:/main";
                        return "redirect:/main";
                    }
                }
            } catch (Exception ex)
            {
                ex.printStackTrace();
            }
    
            return "login/login";
        }
    

    相关文章

      网友评论

          本文标题:springboot 中 shiro 使用问题

          本文链接:https://www.haomeiwen.com/subject/yvpeeqtx.html