之前了解了如何快速引如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共享成功。

登入成功之後需要儲存session,登出登入需要把session進行清理
登出位址修改
預設登出登入的位址是<code>/logout</code>,修改登出位址。
登出成功之後可以自定義處理<code>logoutSuccessUrl</code>或者<code>logoutSuccessHandler</code>,從名字上可以看出來,一個是跳轉位址,一個是實作處理器。
登出成功處理器。
<code>/mylogout</code>位址預設的可能是POST請求,如果浏覽器直接通路可能通路不成功。如此配置即可