1. 程式人生 > >關於使用者登入和許可權驗證功能的實現步驟(五)

關於使用者登入和許可權驗證功能的實現步驟(五)

本文轉載自凌大大的部落格,原部落格地址:[關於使用者登入和許可權驗證功能的實現步驟](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 和生成的uuidd9970477fb2349b984b1c98b8e559a91 兩個引數,呼叫encodePassword 方法,即生成了密碼暗文b7331bcddf29abef3a079ea0cb678f0e ,然後將該暗文作為使用者表中的密碼值儲存到使用者表中即可。

3、密碼驗證的邏輯

  由於密碼存入到使用者表中是暗文,所以在驗證中,不要忘記首先將使用者輸入的密碼123 轉換成暗文,然後再雨資料庫使用者表中儲存的密碼值進行比較。方法也是呼叫第二步中的encodePassword ,但是因為這個方法還需要鹽,即salt ,而這個salt 值又來自於使用者表中當前使用者名稱的主鍵userid值,所以,還要根據使用者名稱查詢到使用者物件,取出userid 值,作為salt ,然後呼叫encodePassword 方法,這樣才能轉換成真正的密碼暗文,如果salt 不對,生成的密碼暗文肯定是不對的。