SpringBoot--- SpringSecurity進行登出,許可權控制

凌丹妙藥發表於2020-08-20

SpringBoot--- SpringSecurity進行登出,許可權控制

環境

IDEA :2020.1

Maven:3.5.6

SpringBoot: 2.0.9 (與此前整合的版本2.3.3 不同,版本適配問題,為配合使用降級)

1、登出

這裡也有一個前提問題需要注意,我們登入操作都是在開啟防跨域攻擊的環境下進行的。

毫無疑問,登出也是在這樣的情況下進行的。

登入時我們提交表單,採用 POST 方法傳輸,通過使用 Thymeleaf 在 form 表單新增 th:action 元素,Thymeleaf 會自動為我們新增 _csrf 元素。

同樣登出操作也是要帶有 _csrf 引數認證的。

<form th:action="@{/logout}" method="post">
			<button type="submit" >登出</button>
		</form>

我們把它做成一個表單按鈕,同時採用 POST 方法傳輸,使用 SpringSecurity 提供的預設 /logout 方法進行登出登出

開發者是不需要在 Controller 配置這個 /logout 方法處理的,和 /login 一樣,這是由 SpringSecurity 提供的。

我們需要在之前登陸的配置類配置登出的各種屬性即可。

 .and()     //這裡採用鏈式程式設計
      .logout()
     	.logoutSuccessUrl("/index")  //登出成功後,調轉的頁面
 /*   	.logoutUrl()       配置自己的登出URL,預設為 /logout
     	.invalidateHttpSession()    是否銷燬session,預設ture
     	.deleteCookies()            刪除指定的cookies                            */

銷燬session 相信很容易理解,一次對話,可以登出關閉,或者關閉頁面會自動銷燬。

記住我

cookies 需要重點介紹一下,這也是我們常用的記住我,在關閉頁面或瀏覽器之後,下次開啟頁面時,是以之前登入的使用者登入的。

為此,我們需要在登入表單增加記住我選項

tr><td><input type="checkbox" name="remember-me"></td><td>Remember me on this computer.</td></tr>

同時在配置類開啟記住我。

.and()
      .rememberMe();  

這裡 checkbox 的 name 我們使用預設的 remember-me ,同樣這一 cookies 的 name 也會被瀏覽器記住,這樣我們只需要開啟記住我即可使用。

如果不使用 name= "remember-me" ,而是使用其他 name 屬性值,則需要配置指定,以便 SpringSecurity 接收是否記住我。

.and()
      .rememberMe().rememberMeParameter("rememberme"); 
//接收前端自定義記住我的name<input name="rememberme">,預設是remember-me

回到 deleteCookies() 方法的配置上,要銷燬指定的 cookies ,我們要指定cookies 的名字即可。

.and()
      .logout().logoutSuccessUrl("/index").deleteCookies("remember-me") 
    //銷燬 name="remember-me"的 cookies

瀏覽器登入,選用記住我

image-20200820154722073

登入後, F12,檢視 cookies

image-20200820154836882

第一個為 cookies,第二個則是此次會話的 session 物件。

可以看到 cookies 是有限期的,預設為 14 天

點選登出。

image-20200820155114500

由於配置了刪除 cookies,cookies 已經被刪除。

重新登入,這次沒有選記住我,同時 session 也已經不是同一個,值已經改變了。

image-20200820155136514

2、許可權控制

同時,頁面還有一個重要的需求沒有實現。

沒有某一許可權的使用者,不應該看到點選的入口(武功祕籍)。所謂得不到的最想要,你這不是擺著饞他嘛!可不能把他害咯。

對此,我們可以結合 Thymeleaf 和 SpringSecurity 實現哪些使用者可以看到哪些內容。

首先,我們要匯入 thymeleaf-springsecurity 整合的依賴

<!--        thymeleaf-springsecurity整合-->
<!--        https://mvnrepository.com/artifact/org.thymeleaf.extras/thymeleaf-extras-springsecurity4 -->
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity4</artifactId>
            <version>3.0.4.RELEASE</version>
        </dependency>

同時還要在頁面標籤匯入名稱空間

<html xmlns:th="http://www.thymeleaf.org"
	  xmlns:sec="https://www.thymeleaf.org/thymeleaf-extras-springsecurity4">

在頁面下把需要許可權限制的內容包起來

	<div sec:authorize="!isAuthenticated()">
	<h2 align="center" >遊客您好,如果想檢視武林祕籍
		<a th:href="@{/toLogin}">請登入</a>   
	</h2>
	</div>

sec:authorize="!isAuthenticated()" 表示未登入認證的使用者才可以檢視到的內容。

<div sec:authorize="isAuthenticated()">
		<a>
			Count:  <span sec:authentication="name"></span>
		</a>
		<form th:action="@{/logout}" method="post"><!--只能通過表單加 -csrf 認證,其他(超連結)無法新增-->
			<button type="submit" >登出</button>
		</form>
	</div>

sec:authorize="isAuthenticated()" 表示已經登入認證的使用者才可以檢視到的內容。

sec:authentication="name" 表示獲取認證的使用者的使用者名稱。

唉,別忘了,重點,有些武功祕籍不能讓沒有許可權的使用者看到,比如 level2 的,像什麼太極拳,七傷拳,梯雲縱。哈哈哈

<div sec:authorize="hasRole('level2')">
<h3>高階武功祕籍</h3>
<ul>
	<li><a th:href="@{/level2/1}">太極拳</a></li>
	<li><a th:href="@{/level2/2}">七傷拳</a></li>
	<li><a th:href="@{/level2/3}">梯雲縱</a></li>
</ul></div>

sec:authorize="hasRole('level2')" 規定只有 level 2 許可權的使用者才能檢視。

其他的可以此類推做出配置。

除此之外,還可以有其他定製化配置,許可權(role),權力(authority),IP ,是否允許(permission)。

spring security 5.1.6版本,從原始碼的角度可以看出使用不同的hasAuthority、hasRole方法判斷許可權時的區別,其實他們最終呼叫的都是hasAnyAuthorityName()方法,唯一不同的就是hasRole()在呼叫時,傳遞了字首defaultRolePrefix,這就導致了他們兩者之間比較的字元產生了差異。spring security應該想代表的意思就是許可權字元加了ROLE_就是角色Role,如果沒有加就是一個許可權Authority。

image-20200820161358826

SpringSecurity 都有為我們提供。

相關文章