目前個人理解,用於校驗的幾種方式
1. 攔截器
2. SpringSecurity驗證(目前沒有弄懂)
3. shiro攔截驗證
攔截器
配置好攔截器後,過濾掉無需驗證的接口,其餘的接口在請求的時候,獲取其token而後解析是不是正確的客戶端資源
SrpingSecurity
SpringSecurity就麻煩多了...此處省略1000字
Shiro自定義認證
shiro在自定義realm中有兩個方法,一個是認證,一個是受權,在其認證的方法內驗證其token
重點
上面說的只是個流程,最主要的是jwt怎麼作token的編碼和解碼的
long expire = 680090;
String = "123";
這裏有兩個須要注意的地方,就是設置過時時間和鹽
過時時間是驗證token的有效時間,在本身手動設置過時時間內是有效的,超過此時間,jwt就沒法解析其token了
其次是鹽,這是個字符串常量,也能夠動態生成鹽,放入數據庫中在驗證的時候獲取解析,這裏須要將其詞符串設置成Base64編碼,否則會解析錯誤..(大坑)這裏使用的是apache的codec來編碼字符串,也可以使用java自帶的Base64工具編碼
生成token
java
/** * 生成jwt token */ public String generateToken(long userId) { Date nowDate = new Date(); //過時時間 Date expireDate = new Date(nowDate.getTime() + expire * 1000); SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS512; //生成加密密鑰 return Jwts.builder() .setHeaderParam("typ", "JWT") .setSubjectsecret(userId+"") .setIssuedAt(nowDate) .setExpiration(expireDate) .signWith(signatureAlgorithm, new String(org.apache.commons.codec.binary.Base64.encodeBase64(secret.getBytes()))) .compact(); }
ps: 在這裏傳入的是用戶id,這在解碼後經過getSubject()方法能夠獲取到,若是須要傳入用戶的多個信息也能夠設置成
.claim("info",userInfo)
.claim("id",userId)
獲取數據庫
@Test public void jwt(){ String s = generateToken(1,"小明"); System.out.println(s); Claims claimByToken = getClaimByToken(s); System.out.println(claimByToken.get("info")+"--"+claimByToken.get("id")); } resut: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJpbmZvIjoi5bCP5piOIiwiaWQiOjEsImlhdCI6MTU0NDg4NTQyOCwiZXhwIjoxNTQ1NTY1NTE4fQ.4SvjebEFd4lixC1jHgyMpQrlPoQz8DI0BTFYsGY0GsPKx_dc7GfDLR2qd_mi46mLpDvJ0HCatfEmhb7w7y9xrA 小明--1
解析tokenapache
/** * 解析token * * @param token * @return */ public Claims getClaimByToken(String token) { String secret = "123"; try { SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS512; return Jwts.parser() .setSigningKey(new String(org.apache.commons.codec.binary.Base64.encodeBase64("123".getBytes()))) .parseClaimsJws(token) .getBody(); }catch (Exception e){ System.out.println("jwt 解密失敗"); return null; } }
ps:目前解決了基本問題,shiro+jwt 就很NICE-__-
至於SpringSecurity:仍是要多多學習了.....服務器