当前位置:   article > 正文

sa-token集成jwt_sa-token jwt

sa-token jwt

向spring容器中加入一下类:用于重写:

  1. <!-- https://mvnrepository.com/artifact/cn.dev33/sa-token-spring-boot-starter -->
  2. <dependency>
  3. <groupId>cn.dev33</groupId>
  4. <artifactId>sa-token-spring-boot-starter</artifactId>
  5. <version>1.19.0</version>
  6. </dependency>
  7. <!-- sa-token整合SpringAOP实现注解鉴权 -->
  8. <dependency>
  9. <groupId>cn.dev33</groupId>
  10. <artifactId>sa-token-spring-aop</artifactId>
  11. <version>1.19.0</version>
  12. </dependency>
  13. <!-- JWT -->
  14. <dependency>
  15. <groupId>com.auth0</groupId>
  16. <artifactId>java-jwt</artifactId>
  17. <version>3.8.2</version>
  18. </dependency>
  19. <dependency>
  20. <groupId>io.jsonwebtoken</groupId>
  21. <artifactId>jjwt</artifactId>
  22. <version>0.9.0</version>
  23. </dependency>

  1. import java.util.Date;
  2. import cn.dev33.satoken.SaManager;
  3. import cn.dev33.satoken.config.SaTokenConfig;
  4. import cn.dev33.satoken.context.model.SaStorage;
  5. import cn.dev33.satoken.dao.SaTokenDao;
  6. import cn.dev33.satoken.exception.NotLoginException;
  7. import cn.dev33.satoken.exception.SaTokenException;
  8. import cn.dev33.satoken.session.SaSession;
  9. import cn.dev33.satoken.stp.SaLoginModel;
  10. import cn.dev33.satoken.stp.SaTokenInfo;
  11. import cn.dev33.satoken.stp.StpLogic;
  12. import cn.dev33.satoken.stp.StpUtil;
  13. import cn.dev33.satoken.util.SaTokenConsts;
  14. import io.jsonwebtoken.*;
  15. import org.springframework.stereotype.Component;
  16. /**
  17. * sa-token集成Jwt
  18. *
  19. * @author Lenovo
  20. */
  21. @Component
  22. public class SaTokenJwtUtil {
  23. /**
  24. * 秘钥 (随便手打几个字母就好了)
  25. */
  26. public static final String BASE64_SECURITY = "79e7c69681b8270162386e6daa53d1dd";
  27. /**
  28. * token有效期 (单位: 秒)
  29. */
  30. public static final long TIMEOUT = 60 * 60 * 2;
  31. public static final String LOGIN_ID_KEY = "loginId";
  32. /**
  33. * 根据userId生成token
  34. *
  35. * @param loginId 账号id
  36. * @return jwt-token
  37. */
  38. public static String createToken(Object loginId) {
  39. // 判断,不可使用默认秘钥
  40. // if(BASE64_SECURITY.equals("79e7c69681b8270162386e6daa53d1dd")) {
  41. // throw new SaTokenException("请更换秘钥");
  42. // }
  43. // 在这里你可以使用官方提供的claim方法构建载荷,也可以使用setPayload自定义载荷,但是两者不可一起使用
  44. JwtBuilder builder = Jwts.builder()
  45. .setHeaderParam("type", "JWT")
  46. .claim(LOGIN_ID_KEY, loginId)
  47. .setIssuedAt(new Date()) // 签发日期
  48. .setExpiration(new Date(System.currentTimeMillis() + 1000 * TIMEOUT)) // 有效截止日期
  49. .signWith(SignatureAlgorithm.HS256, BASE64_SECURITY.getBytes()); // 加密算法
  50. //生成JWT
  51. return builder.compact();
  52. }
  53. /**
  54. * 从一个jwt里面解析出Claims
  55. *
  56. * @param tokenValue token值
  57. * @return Claims对象
  58. */
  59. public static Claims getClaims(String tokenValue) {
  60. // System.out.println(tokenValue);
  61. Claims claims = Jwts.parser()
  62. .setSigningKey(BASE64_SECURITY.getBytes())
  63. .parseClaimsJws(tokenValue).getBody();
  64. return claims;
  65. }
  66. /**
  67. * 从一个jwt里面解析loginId
  68. *
  69. * @param tokenValue token值
  70. * @return loginId
  71. */
  72. public static String getLoginId(String tokenValue) {
  73. try {
  74. Object loginId = getClaims(tokenValue).get(LOGIN_ID_KEY);
  75. if (loginId == null) {
  76. return null;
  77. }
  78. return String.valueOf(loginId);
  79. } catch (ExpiredJwtException e) {
  80. // throw NotLoginException.newInstance(StpUtil.stpLogic.loginKey, NotLoginException.TOKEN_TIMEOUT);
  81. return NotLoginException.TOKEN_TIMEOUT;
  82. } catch (MalformedJwtException e) {
  83. throw NotLoginException.newInstance(StpUtil.stpLogic.loginKey, NotLoginException.INVALID_TOKEN);
  84. } catch (Exception e) {
  85. throw new SaTokenException(e);
  86. }
  87. }
  88. static {
  89. // 判断秘钥
  90. if (BASE64_SECURITY.equals("79e7c69681b8270162386e6daa53d1dd")) {
  91. String warn = "-------------------------------------\n";
  92. warn += "请更换JWT秘钥,不要使用示例默认秘钥\n";
  93. warn += "-------------------------------------";
  94. System.err.println(warn);
  95. }
  96. // 修改默认实现
  97. StpUtil.stpLogic = new StpLogic("login") {
  98. // 重写 (随机生成一个tokenValue)
  99. @Override
  100. public String createTokenValue(Object loginId) {
  101. return SaTokenJwtUtil.createToken(loginId);
  102. }
  103. // 重写 (在当前会话上登录id )
  104. @Override
  105. public void setLoginId(Object loginId, SaLoginModel loginModel) {
  106. // ------ 1、获取相应对象
  107. SaStorage storage = SaManager.getSaTokenContext().getStorage();
  108. SaTokenConfig config = getConfig();
  109. // ------ 2、生成一个token
  110. String tokenValue = createTokenValue(loginId);
  111. storage.set(splicingKeyJustCreatedSave(), tokenValue); // 将token保存到本次request里
  112. if (config.getIsReadCookie() == true) { // cookie注入
  113. SaManager.getSaTokenContext().getResponse().addCookie(getTokenName(), tokenValue, "/", config.getCookieDomain(), (int) config.getTimeout());
  114. }
  115. }
  116. // 重写 (获取指定token对应的登录id)
  117. @Override
  118. public String getLoginIdNotHandle(String tokenValue) {
  119. try {
  120. return SaTokenJwtUtil.getLoginId(tokenValue);
  121. } catch (Exception e) {
  122. return null;
  123. }
  124. }
  125. // 重写 (当前会话注销登录)
  126. @Override
  127. public void logout() {
  128. // 如果连token都没有,那么无需执行任何操作
  129. String tokenValue = getTokenValue();
  130. if (tokenValue == null) {
  131. return;
  132. }
  133. // 如果打开了cookie模式,把cookie清除掉
  134. if (getConfig().getIsReadCookie() == true) {
  135. SaManager.getSaTokenContext().getResponse().deleteCookie(getTokenName());
  136. }
  137. }
  138. // 重写 (获取指定key的session)
  139. @Override
  140. public SaSession getSessionBySessionId(String sessionId, boolean isCreate) {
  141. throw new SaTokenException("jwt has not session");
  142. }
  143. // 重写 (获取当前登录者的token剩余有效时间 (单位: 秒))
  144. @Override
  145. public long getTokenTimeout() {
  146. // 如果没有token
  147. String tokenValue = getTokenValue();
  148. if (tokenValue == null) {
  149. return SaTokenDao.NOT_VALUE_EXPIRE;
  150. }
  151. // 开始取值
  152. Claims claims = null;
  153. try {
  154. claims = SaTokenJwtUtil.getClaims(tokenValue);
  155. } catch (Exception e) {
  156. return SaTokenDao.NOT_VALUE_EXPIRE;
  157. }
  158. if (claims == null) {
  159. return SaTokenDao.NOT_VALUE_EXPIRE;
  160. }
  161. Date expiration = claims.getExpiration();
  162. if (expiration == null) {
  163. return SaTokenDao.NOT_VALUE_EXPIRE;
  164. }
  165. return (expiration.getTime() - System.currentTimeMillis()) / 1000;
  166. }
  167. // 重写 (返回当前token的登录设备)
  168. @Override
  169. public String getLoginDevice() {
  170. return SaTokenConsts.DEFAULT_LOGIN_DEVICE;
  171. }
  172. // 重写 (获取当前会话的token信息)
  173. @Override
  174. public SaTokenInfo getTokenInfo() {
  175. SaTokenInfo info = new SaTokenInfo();
  176. info.tokenName = getTokenName();
  177. info.tokenValue = getTokenValue();
  178. info.isLogin = isLogin();
  179. info.loginId = getLoginIdDefaultNull();
  180. info.loginKey = getLoginKey();
  181. info.tokenTimeout = getTokenTimeout();
  182. // info.sessionTimeout = getSessionTimeout();
  183. // info.tokenSessionTimeout = getTokenSessionTimeout();
  184. // info.tokenActivityTimeout = getTokenActivityTimeout();
  185. info.loginDevice = getLoginDevice();
  186. return info;
  187. }
  188. };
  189. }
  190. }

使用:

  1. import com.alibaba.fastjson.JSON;
  2. import com.example.mindsa.util.UserInfo;
  3. import com.example.mindsa.util.result.AjaxJson;
  4. import org.springframework.web.bind.annotation.RequestHeader;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RequestParam;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import cn.dev33.satoken.stp.StpUtil;
  9. @RestController
  10. @RequestMapping("/test/")
  11. public class TestJwtController {
  12. //登录
  13. @RequestMapping("login")
  14. public AjaxJson login(@RequestParam(defaultValue = "10001") String id) {
  15. UserInfo userInfo = new UserInfo();
  16. userInfo.setName("中国好声音");
  17. StpUtil.setLoginId(JSON.toJSONString(userInfo));
  18. String token = StpUtil.getTokenValue();
  19. return AjaxJson.getSuccess(token);
  20. }
  21. //使用-
  22. @RequestMapping("tokenInfo")
  23. public AjaxJson tokenInfo() {
  24. UserInfo userInfo = JSON.parseObject(StpUtil.getLoginId().toString(), UserInfo.class);
  25. return AjaxJson.getSuccessData(userInfo);
  26. }
  27. //使用-如何是第三方跳转登录,可以把token放到Cookie,也可以放到Head头里面
  28. @RequestMapping("tokenInfo2")
  29. public AjaxJson tokenInfo2(@RequestHeader String satoken) {
  30. UserInfo userInfo = JSON.parseObject(StpUtil.getLoginId().toString(), UserInfo.class);
  31. return AjaxJson.getSuccessData(userInfo);
  32. }
  33. }
  1. //手动解析token
  2. public class ApplicationController extends BaseController {
  3. static String token = "eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.eyJsb2dpbklkIjoie1wiZW1haWxcIjpcIlwiLFwibmFtZVwiOm51bGwsXCJvcmdpZFwiOlwiMFwiLFwicGhvbmVcIjpcIlwiLFwidXNlcm5hbWVcIjpcInpoaWh1emhleWVcIn0iLCJpYXQiOjE2MzIyODEyMzAsImV4cCI6MTY2MzgxNzIzMH0.BL9bTTqeWviD4rPD7L_6tygz6Q78fJ7YBTY3yEPuLUA";
  4. public static void main(String[] args) {
  5. //手动生成token
  6. String mytoken = SaTokenJwtUtil.createToken("loginId");
  7. //手动解析token
  8. Claims claims = SaTokenJwtUtil.getClaims(token);
  9. System.out.println(claims);
  10. }
  11. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/1006362
推荐阅读
相关标签
  

闽ICP备14008679号