1. 程式人生 > >Spring security實現程式碼登入

Spring security實現程式碼登入

首先,現階段網上的spring security配置資料中都涉及登入頁面的的登入。幾乎找不到根據使用者名稱密碼直接登入的方式。現將該方式記錄下來。

我碰到的問題:這是一個很常見的業務需求,使用者訪問系統傳送請求時帶了使用者資訊引數,不需要將頁面跳轉到登入頁面進行登入,直接通過請求時的使用者資訊進行登入Spring Security驗證使用者資訊就OK的。

為了完成這樣的一個需求,過程是還是有點曲折的(原來那個我是一個小白),網上所能給出的什麼登入配置是如下配置過程:

1、spring-security.xml這個配置檔案進行配置form-login這個配置選項。

2、web.xml配置檔案進行配置spring-security過濾器。

3、實現UserDetailsService介面,進行驗證登入。

4、定義登入頁面跳轉方法”/loginpage”。

這樣的登入能在登入頁面實現使用者登入,但和需求直接登入存在差異,需要經過一個一個登入頁面跳轉登入。所以,我開始嘗試修改程式:

獲取使用者資訊直接將使用者名稱密碼轉發到登入方法去。

結果很慘,錯誤大大的,後臺報Access is Denied錯誤。查詢原因是/login在springsecurity配置中是必須以登入頁面(這裡是/loginpage頁面)中表單提交方式訪問的。直接使用forward方式訪問時行不通了。

嘗試很多方式,於是我只能求助萬能的部落格,翻了大半個網際網路中找到了一篇部落格解決該問題的方案。在參考Spring Security官方文件,在官方文件中找到AuthenticationManager

介面、SecurityContextHolder類及SecurityContext介面等完成我自動登入的操作。下面介紹一下上述介面及類:AuthenticationManager介面,接觸了SpringSecurity的童鞋們應該瞭解這個介面是幹什麼的。AuthenticationManager這個介面是SpringSecurity認證介面。SpringSecurity認證是通過AuthenticationManager的authenticate函式實現的。也就是通過AuthenticationManager實現類ProviderManager等等實現類中的authenticate函式完成SpringSecurity的認證。

SecurityContextHolder類,SecurityContextHolder的主要功能是將當前正在執行的thread與SecurityContext關聯起來,簡單來說是將當前請求處理與SecurityContext關聯起來。其中getContext() 通過這個方法獲得當前的SecurityContext。

SecurityContext介面,SecurityContext介面表示的是當前應用的安全上下文。通過此介面可以獲取和設定當前的認證物件。

說到這裡,其實大家應該知道我要做什麼事了。仿照SpringSecurity的驗證機制去進行自動驗證完成整一個驗證過程:

  1. 組裝認證使用者資訊Token。
  2. 使用使用者資訊Token完成SpringSecurity認證獲得認證物件。
  3. 設定第二步驟中的認證物件設定為當前的SpringSecurity的認證物件。
  4. 跳轉認證後想跳轉的頁面。

最後嘗試完成認證過程程式碼:

至此,測試通過了!!!

參考部落格地址: