springboot 中 shiro 使用问题
2019-02-14 本文已影响0人
树蜂
问题列表:
- 登录成功后没有跳到successUrl
- 执行登录后,总在登录页跳转
- 添加自定义filter后,默认filter不生效问题
- 在session中存储用户信息
- 设置session的过期时间
- 访问登录页面,如果已登录则跳转到主页
问题1、登录成功后没有跳到successUrl
原因:shiro去session中找出之前的保存的请求,如果没有的话才会跳转到我们配置的successUrl!详见 Shiro登录成功之后跳到指定URL
解决:
方法1、同Shiro登录成功之后跳到指定URL
方法2、要跳转到主页,但实际跳转到根路径的情况
@RequestMapping({"/", "/main"})
问题2、执行登录后,总在登录页跳转
原因:网页中已存在登录信息,不会执行realm的验证代码,因此不会跳转。
解决:清除浏览器缓存信息即可。
像谷歌或360浏览器,按ctrl+shift+del键调出清除对话框,清理如下内容
![](https://img.haomeiwen.com/i7378160/7a0b93c862a211d6.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中存储用户信息
- 在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";
}