<>基于springboot的JWT令牌权限验证技术简单实现

JWT简介

Json Web Token(JWT):JSON网络令牌,是为了在网络应用环境间传递声明而制定的一种基于JSON的开放标准((RFC
7519)。JWT是一个轻便的安全跨平台传输格式,定义了一个紧凑的自包含的方式用于通信双方之间以 JSON
对象行使安全的传递信息。因为数字签名的存在,这些信息是可信的。

实现步骤:

环境spring boot
<>1、添加jwt依赖 <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</
artifactId> <version>3.8.1</version> </dependency> <dependency> <groupId>
io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version>
</dependency> <>2、在src下创建annotation包
​ 新建自定义注解类 JwtToken
package com.qf.tyleryue_one.annotation; import java.lang.annotation.ElementType
; import java.lang.annotation.Retention; import java.lang.annotation.
RetentionPolicy; import java.lang.annotation.Target; /** * 自定义注解:方法前 表示方法需要拦截 */
@Target({ElementType.METHOD,ElementType.TYPE}) @Retention(RetentionPolicy.
RUNTIME) public @interface JwtToken { } <>3、在src下创建utils包
​ 新建自定义JwtUtils工具类
package com.qf.tyleryue_one.utils; import com.auth0.jwt.JWT; import com.auth0.
jwt.JWTCreator; import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.
algorithms.Algorithm; import jdk.internal.org.objectweb.asm.TypeReference;
import java.util.Date; /** * 用来生成签名,校验签名,通过签名 */ public class JwtUtils {
//令牌有效时间 private final static long EXPIRE_TIME=5*60*1000; //密钥 private final
static String SECRECT="Tyler_Yue_key"; /** * 创建令牌 */ public static String sign(
String userId){ //构建失效时钟 Date exipre_date = new Date(System.currentTimeMillis()
+ EXPIRE_TIME); //创建令牌 JWTCreator.Builder builder = JWT.create();
//给jwt令牌playload中放入发令牌放的用户 //给userid用户发令牌 builder.withAudience(userId);
//设置令牌失效时间 builder.withExpiresAt(exipre_date); //对令牌密钥进行加密 Algorithm algorithm =
Algorithm.HMAC256(SECRECT); String sign = builder.sign(algorithm); return sign;
//返回令牌 } /** * 验证令牌 */ public static boolean verifyToken(String token){ try {
//生成校验器 Algorithm algorithm = Algorithm.HMAC256(SECRECT); //校验 JWTVerifier build
= JWT.require(algorithm).build(); //无异常则校验成功 return true; } catch (Exception e)
{ throw new RuntimeException("令牌过期"); } } } <>4、在src下新建vo包
封装一个返回用户带令牌的 对象
package com.qf.tyleryue_one.vo; import com.alibaba.druid.filter.AutoLoad;
import lombok.AllArgsConstructor; import lombok.Data; import lombok.
NoArgsConstructor; /** * 封装一个返回 含令牌的用户对象 */ @Data @AllArgsConstructor
@NoArgsConstructor public class TokenVo { //用户名 private String usernaem; //令牌名
private String token; } <>5、举例controller层用户登录业务登录带令牌 package com.qf.
tyleryue_one.controller; import com.qf.tyleryue_one.entity.VueUser; import com.
qf.tyleryue_one.service.VueUserService; import com.qf.tyleryue_one.utils.
JwtUtils; import com.qf.tyleryue_one.vo.Msg; import com.qf.tyleryue_one.vo.
TokenVo; import org.springframework.beans.factory.annotation.Autowired; import
org.springframework.stereotype.Controller; import org.springframework.web.bind.
annotation.*; import java.util.UUID; /** * 登录业务 */ @Controller public class
VueUserController { @Autowired private VueUserService vueUserService;
@RequestMapping(value = "/dealLogin",method = RequestMethod.POST) @CrossOrigin
@ResponseBody public Msg login(@RequestBody VueUser vueUser){ VueUser vueUser1 =
vueUserService.selectByUsername(vueUser.getUsername()); if (vueUser1!=null){ if
(vueUser1.getPassword().equals(vueUser.getPassword())){ //密码匹配,发放令牌
///随机生成字符串未userid String userid = UUID.randomUUID().toString(); String token =
JwtUtils.sign(userid); //封装令牌对象 TokenVo tokenVo = new TokenVo(vueUser.
getUsername(), token); return new Msg(200,"登录成功,令牌已发放",tokenVo); }else { return
new Msg(403,"密码错误",null); } }else { return new Msg(403,"用户不存在",null); } } }

技术
©2020 ioDraw All rights reserved
泡泡玛特拟12月11日在香港上市 最多融资6.74亿美元java:数组及数组常用算法总结Kaldi之父Daniel Povey博士:发布k2核心代码血管里有垃圾 必须定期输液通?坑你没商量袁隆平团队再次向双季稻亩产1500公斤冲刺mvcc实现原理Java程序员还没有掌握SpringBoot?这一份文档,你真应该好好学学微信小程序自定义波浪组件操作系统与网络协议晦涩难懂,华为18级工程师神级文档助你过关C/C++字符串格式化