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類,SecurityContextHolder的主要功能是將當前正在執行的thread與SecurityContext關聯起來,簡單來說是將當前請求處理與SecurityContext關聯起來。其中getContext() 通過這個方法獲得當前的SecurityContext。
SecurityContext介面,SecurityContext介面表示的是當前應用的安全上下文。通過此介面可以獲取和設定當前的認證物件。
說到這裡,其實大家應該知道我要做什麼事了。仿照SpringSecurity的驗證機制去進行自動驗證完成整一個驗證過程:
- 組裝認證使用者資訊Token。
- 使用使用者資訊Token完成SpringSecurity認證獲得認證物件。
- 設定第二步驟中的認證物件設定為當前的SpringSecurity的認證物件。
- 跳轉認證後想跳轉的頁面。
最後嘗試完成認證過程程式碼:
至此,測試通過了!!!
參考部落格地址: