基於Token實現身份驗證和許可權管理
阿新 • • 發佈:2018-12-31
一、什麼是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是否失效,若失效——憑證已失效
到許可權表查詢是否在許可權內,若沒有——該使用者未分配資源