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 引數認證的。**
~~~HTML
~~~
我們把它做成一個表單按鈕,同時採用 POST 方法傳輸,**使用 SpringSecurity 提供的預設 /logout 方法進行登出登出**。
開發者是不需要在 Controller 配置這個 /logout 方法處理的,和 /login 一樣,這是由 SpringSecurity 提供的。
我們需要在之前登陸的配置類配置登出的各種屬性即可。
~~~java
.and() //這裡採用鏈式程式設計
.logout()
.logoutSuccessUrl("/index") //登出成功後,調轉的頁面
/* .logoutUrl() 配置自己的登出URL,預設為 /logout
.invalidateHttpSession() 是否銷燬session,預設ture
.deleteCookies() 刪除指定的cookies */
~~~
銷燬session 相信很容易理解,一次對話,可以登出關閉,或者關閉頁面會自動銷燬。
#### 記住我
cookies 需要重點介紹一下,這也是我們常用的記住我,在關閉頁面或瀏覽器之後,下次開啟頁面時,是以之前登入的使用者登入的。
為此,我們需要在登入表單增加記住我選項
~~~HTML
tr> Remember me on this computer.
~~~
同時在配置類開啟記住我。
~~~java
.and()
.rememberMe();
~~~
這裡 checkbox 的 name 我們使用**預設的 remember-me** ,同樣這一 cookies 的 name 也會被瀏覽器記住,這樣我們只需要開啟記住我即可使用。
如果不使用 name= "remember-me" ,而是使用其他 name 屬性值,則需要配置指定,以便 SpringSecurity 接收是否記住我。
~~~java
.and()
.rememberMe().rememberMeParameter("rememberme");
//接收前端自定義記住我的name,預設是remember-me
~~~
回到 deleteCookies() 方法的配置上,要銷燬指定的 cookies ,我們要指定cookies 的名字即可。
~~~java
.and()
.logout().logoutSuccessUrl("/index").deleteCookies("remember-me")
//銷燬 name="remember-me"的 cookies
~~~
瀏覽器登入,選用記住我
![image-20200820154722073](https://i.loli.net/2020/08/20/srU6VBvHFw8J9xA.png)
登入後, F12,檢視 cookies
![image-20200820154836882](https://i.loli.net/2020/08/20/rc6sbpgqh53Ifaw.png)
第一個為 cookies,第二個則是此次會話的 session 物件。
可以看到 cookies 是有限期的,**預設為 14 天**。
點選登出。
![image-20200820155114500](https://i.loli.net/2020/08/20/3QugLoIJCniZHv8.png)
由於配置了刪除 cookies,cookies 已經被刪除。
重新登入,這次沒有選記住我,同時 session 也已經不是同一個,值已經改變了。
![image-20200820155136514](https://i.loli.net/2020/08/20/IrjgQuOWGCSqxLZ.png)
### 2、許可權控制
同時,頁面還有一個重要的需求沒有實現。
沒有某一許可權的使用者,不應該看到點選的入口(武功祕籍)。所謂得不到的最想要,你這不是擺著饞他嘛!可不能把他害咯。
對此,我們可以結合 Thymeleaf 和 SpringSecurity 實現哪些使用者可以看到哪些內容。
首先,我們要匯入 thymeleaf-springsecurity 整合的依賴
~~~xml
org.thymeleaf.extras
thymeleaf-extras-springsecurity4
3.0.4.RELEASE
~~~
同時還要在頁面標籤匯入名稱空間
~~~html
~~~
在頁面下把需要許可權限制的內容包起來
~~~html
~~~
sec:authorize="isAuthenticated()" 表示已經登入認證的使用者才可以檢視到的內容。
sec:authentication="name" 表示獲取認證的使用者的使用者名稱。
唉,別忘了,重點,有些武功祕籍不能讓沒有許可權的使用者看到,比如 level2 的,像什麼太極拳,七傷拳,梯雲縱。哈哈哈
~~~HTML
遊客您好,如果想檢視武林祕籍 請登入
~~~ sec:authorize="!isAuthenticated()" 表示未登入認證的使用者才可以檢視到的內容。 ~~~html Count:高階武功祕籍
- 太極拳
- 七傷拳
- 梯雲縱