目前个人理解,用于校验的几种方式
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:仍是要多多学习了.....服务器