天天看點

【spring系列】spring security(2)開發實踐

​ 之前了解了如何快速引如spring security進行項目的權限控制,但是在實際過程中業務要複雜很多。此來了解spring security實戰開發執行個體。

1.自定義過濾

2.成功與異常之後自定義處理

3.自定義登入-短信登入

3.1建立短信登入token

3.2 建立短信登入Filter

3.3建立短信Provider

3.4配置短信Filter

4.登入前驗證

5.session共享

5.登出登入

​ 并不是所有的請求都需要權限驗證,需要有的請求取消權限驗證。

如此可以完成某些請求不需要驗證。

注:hasRole這個是在<code>UserDetailsService</code>的實作中進行授權的。但是權限資訊預設會有<code>ROLE_</code>作為開頭。

一般前後端分離的時候,後端是沒有頁面的,如果有各種異常操作,隻需要傳回狀态碼即可

SimpleUrlAuthenticationFailureHandler請求失敗處理類,在<code>spring security</code>認證失敗後會進入此類,在此類中可以自定義認證失敗邏輯。前後端分離時可進行自定義異常傳回。

SavedRequestAwareAuthenticationSuccessHandler請求成功處理類。<code>spring security</code>在請求成功時,會進入這裡,可以自定義傳回使用者資訊。

寫好成功和失敗的邏輯之後進行配置。

成功登陸之後傳回:

{“authorities”:[{“authority”:“ROLE_admin”}],“details”:{“remoteAddress”:“0:0:0:0:0:0:0:1”,“sessionId”:“9D02A1032740267FC1392647ADF31166”},“authenticated”:true,“principal”:{“password”:null,“username”:“admin”,“authorities”:[{“authority”:“ROLE_admin”}],“accountNonExpired”:true,“accountNonLocked”:true,“credentialsNonExpired”:true,“enabled”:true},“credentials”:null,“name”:“admin”}

成功和失敗時候有自定義處理器還有自定義跳轉<code>successForwardUrl</code>和<code>failureForwardUrl</code>可根據場景進行選擇

預設的表單登入是無法滿足我們的需求,比如登入位址修改,登入成功之後傳回json。

短信登入

token是用來存儲使用者資訊的。

這個就類似<code>UsernamePasswordAuthenticationFilter</code>主要是攔截請求到此。

設定路徑為<code>/auth/mobile</code>的<code>get</code>請求到此filter。

短信登入邏輯寫好之後,将短信登入的邏輯進行配置。使它生效。

修改<code>ExampleSecurityConfig</code>

<code>spring security</code>是很多的Filter組成的,我們可以在Filter鍊上進行添加自己的Filter。比如在輸入賬号密碼前輸入手機驗證碼或者圖檔驗證碼。

建立驗證Filter

配置此Filter在短信驗證Filter之前。

​ 其實短信驗證碼驗證邏輯寫在短信登入Filter中也可以。但是随着業務邏輯的逐漸複雜,如果普通賬号密碼登入也需要驗證碼時,就需要單獨提取出來一個Filter進行驗證,防止代碼備援。

單機情況下session幾乎不需要處理,若多個服務的時候,就要實作session共享。

redis實作session共享

添加redis依賴

添加redis配置資訊

直接複制走即可

配置好之後,啟動redis,通過登入,登入完成之後redis如果有<code>spring:session</code>開頭的key,證明session共享成功。

【spring系列】spring security(2)開發實踐

登入成功之後需要儲存session,登出登入需要把session進行清理

登出位址修改

預設登出登入的位址是<code>/logout</code>,修改登出位址。

登出成功之後可以自定義處理<code>logoutSuccessUrl</code>或者<code>logoutSuccessHandler</code>,從名字上可以看出來,一個是跳轉位址,一個是實作處理器。

登出成功處理器。

<code>/mylogout</code>位址預設的可能是POST請求,如果浏覽器直接通路可能通路不成功。如此配置即可

上一篇: CSS3 字型