Shiro提供了Remember Me的功能,用户的登录状态不会因为浏览器的关闭而失效,直到Cookie过期。
更改ShiroConfig
在ShiroConfig 中加入两个方法。
/**
*
* @Author xjw
* @Date 2018/10/10 13:54
* @Description : 设置Cookie对象
*
**/
public SimpleCookie rememberMeCookie() {
//设置 cookie 名称 ,对应登录接口
SimpleCookie cookie = new SimpleCookie("rememberMe");
// 设置 cookie 的过期时间,单位为秒,这里为一天
cookie.setMaxAge(3600);
return cookie;
}
/**
*
* @Author xjw
* @Date 2018/10/10 13:55
* @Description : 设置Cookie的管理对象
*
**/
public CookieRememberMeManager rememberMeManager() {
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
cookieRememberMeManager.setCookie(rememberMeCookie());
cookieRememberMeManager.setCipherKey(Base64.decode("5AvVhmFLUs0KTA3Kprsdag=="));
return cookieRememberMeManager;
}
在SecurityManager中设置:
/**
* SecurityManager 为shiro安全管理器,管理着所有的Subject
*
* @return
*/
@Bean
public SecurityManager securityManager() {
//配置 SecurityManager 并注入 shrioRealm
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(shiroRealm());
securityManager.setRememberMeManager(rememberMeManager());
return securityManager;
}
修改权限配。
将ShiroFilterFactoryBean中的 filterChainDefinitionMap.put("/.action", "authc");改为filterChainDefinitionMap.put("/.action", "user");
更改登录方法
/**
* 用户登录
*
* @param user
*/
@PostMapping(value = "/login.action")
public void login(HttpServletResponse response, HttpServletRequest request, @RequestBody User user) {
Map<String, Object> result = new HashMap<>();
Subject subject = SecurityUtils.getSubject();
// UsernamePasswordToken token = new UsernamePasswordToken(user.getUsercode(), MD5Util.get32Md5(user.getUserpwd()));
UsernamePasswordToken token = new UsernamePasswordToken(user.getUsercode(), MD5Util.get32Md5(user.getUserpwd()), user.isRememberMe());
try {
subject.login(token);
result.put("userInfo", subject.getPrincipal());
result.put("toke", subject.getSession().getId());
result.put("code", 200);
} catch (IncorrectCredentialsException e) {
result.put("msg", "密码错误");
} catch (LockedAccountException e) {
result.put("msg", "登录失败,用户被冻结");
} catch (AuthenticationException e) {
result.put("msg", "用户不存在");
} catch (Exception e) {
e.printStackTrace();
}
ResponeUtil.writerObject(response, result);
}
前端登录修改
我的前端项目采用把登录信息放到 localStorage 中。
前端登录接口 多传一个 boolean类型的 remember参数。