spring security預設的乙個實現是使用使用者名稱密碼登入,當初我們在開始做專案時,也是先使用這種登入方式,並沒有多考慮其他的登入方式。而後面需求越來越多,我們需要支援簡訊驗證碼登入了,這時候再看了解spring security中如何實現簡訊驗證碼登入。
這裡有一篇文章:springboot 整合 spring security(8)——簡訊驗證碼登入,提供了一種比較正規的方法來解決這個問題,比如需要寫filter類等等。但是我們需要臨時性解決這個問題,於是就通過了其它非常規手段來實現。
我們知道預設的方式是,資料庫裡的user表儲存了username和password,其中後者是密文儲存。當使用者登入時,spring security會拿使用者傳過來的密碼進行加密後和資料庫中password的值進行比較,相同則登入成功。如果是簡訊登入,需要傳入的是手機號和驗證碼,比如叫phone和verification_code。
在我們的資料庫中,username和phone都是唯一的,那我們想達到的效果就是,讓對phone和 verification_code的校驗轉變成對username和password的校驗就好了。這樣一來,實現的邏輯如下:
在user表中新增乙個欄位verification_code,等使用者獲取手機驗證碼時,後端將返回給使用者的驗證碼進行加密,加密方式和對password的處理一樣,然後儲存到 verification_code 欄位中。然後使用者在輸入手機號和驗證碼登入時,我們根據手機號獲取使用者的username,然後將username和驗證碼傳給獲取token的介面,讓這個介面以為我們使用的是使用者名稱密碼的登入方式,但是這個password值需要使用 verification_code欄位的值來代替就好了。
那又怎麼將 verification_code的值替換password值返回給spring security呢?
我們有乙個userservicedetail類,實現了userdetailsservice介面,其中過載了方法:loaduserbyusername,spring security就是從這裡拿到user表的password後進行比較判斷的。那我們修改這個方法,如果是驗證碼登入方式,就把password屬性設定成 verification_code的值,這樣就欺騙了spring security,讓它拿加密後的驗證碼去和password屬性比較,如果相等也表示登入成功了。具體**如下:
這種做法確實有點繞,也不是正規的做法,但是因為我們對spring security這個流程有了一定程度的理解,就可以這麼取巧來先達到目的,之後可能需要按正規的方式來做,因此不建議效仿,只是提供了另一種一種思路而已。
初步理解Spring Security並實踐
spring security如何使用,先在你的專案pom.xml檔案中宣告依賴。org.springframework.bootgroupid spring boot starter securityartifactid dependency 然後建立乙個類並繼承websecurityconfig...
初步理解Spring Security並實踐
spring security如何使用,先在你的專案pom.xml檔案中宣告依賴。org.springframework.boot spring boot starter security 然後建立乙個類並繼承websecurityconfigureradapter這個方法,並在之類中重寫confi...
初步理解Spring Security並實踐
spring security如何使用,先在你的專案pom.xml檔案中宣告依賴。org.springframework.boot spring boot starter security 然後建立乙個類並繼承websecurityconfigureradapter這個方法,並在之類中重寫confi...