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);
......下面省略