關於使用者登入和許可權驗證功能的實現步驟(五)
本文轉載自凌大大的部落格,原部落格地址:[關於使用者登入和許可權驗證功能的實現步驟](https://blog.csdn.net/wohaqiyi/article/details/79337981)
接上一篇文章shiro框架—關於使用者登入和許可權驗證功能的實現步驟(四)
關於上一篇中,寫出了關於shiro在springboot專案的配置步驟,還有幾個簡單的注意點沒有說到。
1、使用者名稱保證唯一性
這個應該很容易理解,對於一個系統來說,使用者名稱是唯一的,不可重複,如果我們在註冊使用者時,比如隨便起了一個使用者名稱doudouchong
這樣的使用者。合理的方式是,在輸入註冊使用者名稱後,頁面應該馬上呼叫一個介面,即查詢當前使用者名稱是否佔用,如果佔用應該提示已註冊。在這樣的前提下,就能保證使用者名稱的唯一了。
2、密碼入庫要用暗文
在註冊使用者時,比如我們將註冊的使用者doudouchong
密碼為123
,這樣的資訊儲存到資料庫使用者表中,但是合理的情況下,你不能把這個密碼明文123
儲存到資料庫中,你應該把暗文儲存到資料庫中,密碼加密後的暗文,可以有多種方法來做到,比如我們專案中是用的下邊的這個類:
package microservice.fpzj.core.util;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.util.ByteSource;
public class PasswordUtil {
private String algorithmName = "md5"; //指定雜湊演算法為MD5,還有別的演算法如:SHA256、SHA1、SHA512
private int hashIterations = 2; //雜湊迭代次數 md5(md5(pwd)): new Md5Hash(pwd, salt, 2).toString()
public void setAlgorithmName(String algorithmName) {
this.algorithmName = algorithmName;
}
public void setHashIterations(int hashIterations) {
this.hashIterations = hashIterations;
}
//加密:輸入明文得到密文
public String encodePassword(String pwd, String salt) {
//user.setSalt(randomNumberGenerator.nextBytes().toHex());
String newPassword = new SimpleHash(
algorithmName,
pwd,
ByteSource.Util.bytes(salt),
hashIterations).toHex();
return newPassword;
}
public boolean verifyPassword(String targetPassword, String pwd, String salt){
String newPassword = this.encodePassword(targetPassword, salt);
if(newPassword.equals(pwd)){
return true;
}else{
return false;
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
以上的 encodePassword
方法,即是加密密碼明文的方法,該方法的引數除了明文密碼,還有salt
,這個是鹽,通過這個鹽,可以對密碼進一步加密,而這個鹽,這裡其實使用的是userid
,是通過UUID
獲取的一個隨機的字串,作為使用者表記錄主鍵userid
的值,然後它們兩個通過encodePassword
方法生成密碼暗文,大體意思如下圖所示:
通過傳入123
和生成的uuid
值d9970477fb2349b984b1c98b8e559a91
兩個引數,呼叫encodePassword
方法,即生成了密碼暗文b7331bcddf29abef3a079ea0cb678f0e
,然後將該暗文作為使用者表中的密碼值儲存到使用者表中即可。
3、密碼驗證的邏輯
由於密碼存入到使用者表中是暗文,所以在驗證中,不要忘記首先將使用者輸入的密碼123
轉換成暗文,然後再雨資料庫使用者表中儲存的密碼值進行比較。方法也是呼叫第二步中的encodePassword
,但是因為這個方法還需要鹽,即salt
,而這個salt
值又來自於使用者表中當前使用者名稱的主鍵userid
值,所以,還要根據使用者名稱查詢到使用者物件,取出userid
值,作為salt
,然後呼叫encodePassword
方法,這樣才能轉換成真正的密碼暗文,如果salt
不對,生成的密碼暗文肯定是不對的。