1. 程式人生 > >基於Token實現身份驗證和許可權管理

基於Token實現身份驗證和許可權管理

一、什麼是token

HTTP是一種無狀態的協議,也就是HTTP沒法儲存客戶端的資訊,沒辦法區分每次請求的不同。

Token是伺服器生成的一串字元,作為客戶端請求的令牌。當第一次登陸後,伺服器會分發Tonken字串給客戶端。後續的請求,客戶端只需帶上這個Token,伺服器即可知道是該使用者的訪問。

使用Tonken,可以實現:許可權管理、身份驗證、防止同一賬號異地登入。

二、Token的驗證過程

客戶端:使用者名稱和密碼請求登入

伺服器:收到請求,驗證使用者名稱和密碼,驗證成功後,分發一個Token返回給客戶端

客戶端:將Token儲存,例如放在 Cookie 裡或者 Local Storage 裡,後續每次請求,帶上此Token

伺服器:收到請求,驗證Token是否正確,驗證成功返回請求資料

 

2.1 Token的生成

String token = user.getUserid() + "-" + createStringId();
user.setToken(token);

public static String createStringId() {
    UUID uuid = UUID.randomUUID();
    return uuid.toString();
}


public final class UUID implements java.io.Serializable, Comparable<UUID> {
    public static UUID randomUUID() {
        SecureRandom ng = Holder.numberGenerator;

        byte[] randomBytes = new byte[16];
        ng.nextBytes(randomBytes);
        randomBytes[6]  &= 0x0f;  /* clear version        */
        randomBytes[6]  |= 0x40;  /* set to version 4     */
        randomBytes[8]  &= 0x3f;  /* clear variant        */
        randomBytes[8]  |= 0x80;  /* set to IETF variant  */
        return new UUID(randomBytes);
    }
}

2.2 Token實現許可權管理

案例

請求載入最新供應鏈訊息

客戶端:請求介面+token

伺服器:驗證是否能通過token找到使用者,若不能——該token不正確

                驗證token是否失效,若失效——憑證已失效
                到許可權表查詢是否在許可權內,若沒有——該使用者未分配資源