美文网首页
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