jwt生成token在项目里的应用

编程入门 行业动态 更新时间:2024-10-10 00:21:14

jwt生成token在<a href=https://www.elefans.com/category/jswz/34/1771421.html style=项目里的应用"/>

jwt生成token在项目里的应用

JWT工具类编写

(1)tensquare_common工程引入依赖(考虑到工具类的通用性)

        <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.6.0</version></dependency>

(2)修改tensquare_common工程,创建util.JwtUtil

@ConfigurationProperties("jwt.config")
public class JwtUtil {private String key ;private long ttl ;//一个小时public String getKey() {return key;}public void setKey(String key) {this.key = key;}public long getTtl() {return ttl;}public void setTtl(long ttl) {this.ttl = ttl;}/*** 生成JWT** @param id* @param subject* @return*/public String createJWT(String id, String subject, String roles) {long nowMillis = System.currentTimeMillis();Date now = new Date(nowMillis);JwtBuilder builder = Jwts.builder().setId(id).setSubject(subject).setIssuedAt(now).signWith(SignatureAlgorithm.HS256, key).claim("roles", roles);if (ttl > 0) {builder.setExpiration( new Date( nowMillis + ttl));}return builderpact();}/*** 解析JWT* @param jwtStr* @return*/public Claims parseJWT(String jwtStr){return  Jwts.parser().setSigningKey(key).parseClaimsJws(jwtStr).getBody();}}

(3)修改tensquare_user工程的application.yml, 添加配置

jwt:config:key: itcastttl: 3600000

## 2 管理员登陆后台签发token

(1)配置bean .修改tensquare_user工程Application类

	@Beanpublic JwtUtil jwtUtil(){return new JwtUtil();}

(2)修改AdminController的login方法

	@Autowiredprivate JwtUtil jwtUtil;/*** 用户登陆* @param loginname* @param password* @return*/@RequestMapping(value="/login",method=RequestMethod.POST)public Result login(@RequestBody Map<String,String> loginMap){Admin admin = adminService.findByLoginnameAndPassword(loginMap.get("loginname"), loginMap.get("password"));if(admin!=null){//生成tokenString token = jwtUtil.createJWT(admin.getId(), admin.getLoginname(), "admin");Map map=new HashMap();map.put("token",token);map.put("name",admin.getLoginname());//登陆名return new Result(true,StatusCode.OK,"登陆成功",map);}else{return new Result(false,StatusCode.LOGINERROR,"用户名或密码错误");}}

测试运行结果

{"flag": true,"code": 20000,"message": "登陆成功","data": {"token": "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI5ODQzMjc1MDc4ODI5MzgzNjgiLCJzdWIiOiJ4aWFvbWkiLCJpYXQiOjE1MjM1MjQxNTksInJvbGVzIjoiYWRtaW4iLCJleHAiOjE1MjM1MjQ1MTl9._YF3oftRNTbq9WCD8Jg1tqcez3cSWoQiDIxMuPmp73o","name":"admin"}
}

3 删除用户功能鉴权

需求:删除用户,必须拥有管理员权限,否则不能删除。

前后端约定:前端请求微服务时需要添加头信息Authorization ,内容为Bearer+空格+token

(1)修改UserController的delete方法 ,判断请求中的头信息,提取token并验证权限。

	@Autowiredprivate HttpServletRequest request;/*** 删除* @param id*/@RequestMapping(value="/{id}",method= RequestMethod.DELETE)public Result delete(@PathVariable String id ){String authHeader = request.getHeader("Authorization");//获取头信息if(authHeader==null){return new Result(false,StatusCode.ACCESSERROR,"权限不足");}if(!authHeader.startsWith("Bearer ")){return new Result(false,StatusCode.ACCESSERROR,"权限不足");}String token=authHeader.substring(7);//提取tokenClaims claims = jwtUtil.parseJWT(token);if(claims==null){return new Result(false,StatusCode.ACCESSERROR,"权限不足");}if(!"admin".equals(claims.get("roles"))){return new Result(false,StatusCode.ACCESSERROR,"权限不足");}userService.deleteById(id);return new Result(true,StatusCode.OK,"删除成功");}

4 ## 使用拦截器方式实现token鉴权

如果我们每个方法都去写一段代码,冗余度太高,不利于维护,那如何做使我们的代码看起来更清爽呢?我们可以将这段代码放入拦截器去实现

4.1 添加拦截器

Spring为我们提供了org.springframework.web.servlet.handler.HandlerInterceptorAdapter这个适配器,继承此类,可以非常方便的实现自己的拦截器。他有三个方法:

分别实现预处理、后处理(调用了Service并返回ModelAndView,但未进行页面渲染)、返回处理(已经渲染了页面)
在preHandle中,可以进行编码、安全控制等处理;
在postHandle中,有机会修改ModelAndView;
在afterCompletion中,可以根据ex是否为null判断是否发生了异常,进行日志记录。

(1)创建拦截器类。创建 com.tensquare.user.interceptor

@Component
public class JwtInterceptor extends HandlerInterceptorAdapter {@Autowiredprivate JwtUtil jwtUtil;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println("经过了拦截器");return true;}
}

(2)配置拦截器类,创建com.tensquare.user.ApplicationConfig

@Configuration
public class ApplicationConfig extends WebMvcConfigurationSupport {@Autowiredprivate JwtInterceptor jwtInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(jwtInterceptor).addPathPatterns("/**").excludePathPatterns("/**/login");}
}

更多推荐

jwt生成token在项目里的应用

本文发布于:2024-02-06 08:26:13,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1747713.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:项目   jwt   token

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!