SpringBoot-Shiro
(记住登录状态)(2019-12-13)
当用户成功登录后,关闭浏览器然后再打开浏览器访问http://localhost:8080/index接口,页面会跳转到登录页,之前的登录因为浏览器的关闭已经失效。
Shiro
为我们提供了Remember Me(记住登录状态)的功能,用户的登录状态不会因为浏览器的关闭而失效,直到Cookie
过期。
接着登录认证的代码改造:
1. 更改 ShiroConfig.java
加入cookie
管理对象
/**
* cookie对象
*
* @return org.apache.shiro.web.servlet.SimpleCookie
* @author: zhihao
* @date: 2019/12/13
* {@link #}
*/
public SimpleCookie rememberMeCookie() {
// 设置cookie名称,对应login.html页面的<input type="checkbox" name="rememberMe"/>
SimpleCookie cookie = new SimpleCookie("rememberMe");
// 设置cookie的过期时间,单位为秒,这里为一天
cookie.setMaxAge(86400);
return cookie;
}
/**
* cookie管理对象
*
* @return org.apache.shiro.web.mgt.CookieRememberMeManager
* @author: zhihao
* @date: 2019/12/13
* {@link #}
*/
public CookieRememberMeManager rememberMeManager() {
CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
cookieRememberMeManager.setCookie(rememberMeCookie());
// rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)
cookieRememberMeManager.setCipherKey(Base64.decode("2AvVhdsgUs0FSA3SDFAdag=="));
return cookieRememberMeManager;
}
2. 接下来将cookie管理对象设置到SecurityManager
(安全管理器)中
修改注册DefaultWebSecurityManager
交给框架管理的方法:
@Bean
public DefaultWebSecurityManager securityManager(){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(shiroRealm());
//设置管理器记住我
securityManager.setRememberMeManager(rememberMeManager());
return securityManager;
}
3. 最后修改权限配置
将ShiroFilterFactoryBean
的filterChainDefinitionMap.put("/**", "authc");
更改为filterChainDefinitionMap.put("/**", "user");
。user
指的是用户认证通过或者配置了Remember Me记住用户登录状态后可访问。
// 除上以外所有url都必须认证通过才可以访问,未通过认证自动访问LoginUrl
filterChainDefinitionMap.put("/**", "user");
4. 更改 login.html
加入记住登录状态选择框 checkbox
: name的属性为: rememberMe
<p><input type="checkbox" name="rememberMe" id="rememberMe"/>记住登录状态</p>
<script type="text/javascript">
function login() {
var username = $("#username").val();
var password = $("#password").val();
//提交请求时 提交单选框的值 is方法为筛选 是否为选中状态 返回值是布尔类型
var rememberMe = $("#rememberMe").is(':checked');
$.ajax({
type: "post",
url: "/login",
data: {"username": username, "password": password , "rememberMe" : rememberMe},
dataType: "json",
success: function (result) {
if (result.code == "success") {
location.href ='/index';
} else {
alert(result.msg);
}
}
});
}
</script>
5. 修改登录login
接口API
,接收单选框的值并放入创建用户令牌token构建里面。
@PostMapping("/login")
public Map login( String username, String password , boolean rememberMe){
UsernamePasswordToken token = new UsernamePasswordToken(username, password,rememberMe);
......下面省略