《项目实战》构建SpringCloud alibaba项目(二、构建微服务鉴权子工程store-authority-service)
系列文章目录
构建SpringCloud alibaba项目(一、构建父工程、公共库、网关)
构建SpringCloud alibaba项目(二、构建微服务鉴权子工程store-authority-service)
文章目录
- 系列文章目录
- 前言
- 1、在公共库增加 UserInfo类
- 2、微服务鉴权子工程store-authority-service
- 2.1、创建子工程store-authority-service
- 2.2、修改pom.xml配置
- 2.3、修改application.yml配置
- 2.4、配置JWT
- 2.5、编写JWT测试类
- 2.5.1、运行结果
- 2.6、对外发布鉴权API - AuthController
- 总结
前言
构建微服务鉴权子工程store-authority-service,集成JWT,提供权限验证功能。
1、在公共库增加 UserInfo类
微服务鉴权子工程,需要用到用户信息类,存放在JWT生成的Token信息里。
package com.kelvin.common.entity; import lombok.Data; /*** * @title UserInfo * @desctption * @author Administrator * @create 2023/6/19 17:05 **/ @Data public class UserInfo { private long id; private String userAccount; private String userName; private String pwd; }
2、微服务鉴权子工程store-authority-service
2.1、创建子工程store-authority-service
创建Module,store-authority-service
2.2、修改pom.xml配置
加入依赖:springboot、JWT、nacos-discovery、公共库等
4.0.0 com.kelvin onlinestore 1.0-SNAPSHOT store-authority-service jar authority-service http://maven.apache.org UTF-8 io.jsonwebtoken jjwt 0.7.0 com.auth0 java-jwt 3.4.0 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-devtools runtime true org.springframework.boot spring-boot-autoconfigure com.kelvin store-common com.google.code.gson gson 2.7
2.3、修改application.yml配置
server: port: 7777 spring: application: name: store-auth-service cloud: nacos: discovery: server-addr: localhost:8848 #Nacos server 的地址 config: jwt: # 加密密钥 secret: kelvin # token有效时长 expire: 200 # header 名称 header: token
2.4、配置JWT
package com.kelvin.authority.config; /*** * @title JwtConfig * @desctption JWT配置类 * @author kelvin * @create 2023/6/8 9:39 **/ import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.Date; @Component @ConfigurationProperties(prefix = "config.jwt") @Data public class JwtConfig { /** * 密钥 */ private String secret; /** * 过期时间 */ private Long expire; /** * 头部 */ private String header; /** * 生成token * @param subject * @return */ public String createToken(String subject){ Date nowDate = new Date(); Date expireDate = new Date(nowDate.getTime() + expire * 1000); return Jwts.builder() .setHeaderParam("typ","JWT") .setSubject(subject) .setIssuedAt(nowDate) .setExpiration(expireDate) .signWith(SignatureAlgorithm.HS512,secret) .compact(); } /** * 获取token中的注册信息 * @param token * @return */ public Claims getTokenClaim(String token){ try{ return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); }catch (Exception e){ return null; } } /** * 验证token是否过期 * @param expirationTime * @return */ public boolean isTokenExpired(Date expirationTime){ if(null == expirationTime){ return true; }else{ return expirationTime.before(new Date()); } } /** * 获取token的失效时间 * @param token * @return */ public Date getExpirationDateFromToken(String token){ Claims tokenClaim = this.getTokenClaim(token); if(tokenClaim == null){ return null; }else{ return this.getTokenClaim(token).getExpiration(); } } /** * 获取token中的用户名 * @param token * @return */ public String getUserNameFromToken(String token){ return this.getTokenClaim(token).getSubject(); } /** * 获取token中发布时间 * @param token * @return */ public Date getIssuedDateFromToken(String token){ return this.getTokenClaim(token).getIssuedAt(); } }
2.5、编写JWT测试类
package com.kelvin.authority.test; import com.google.gson.Gson; import com.kelvin.authority.config.JwtConfig; import com.kelvin.common.entity.UserInfo; /*** * @title JwtMain * @desctption JWT本地测试类 * @author Administrator * @create 2023/6/8 15:04 **/ public class JwtMain { public static void main(String[] args) { JwtConfig jwtConfig = new JwtConfig(); jwtConfig.setExpire(10L); jwtConfig.setSecret("kelvin"); jwtConfig.setHeader("token"); UserInfo userInfo = new UserInfo(); userInfo.setId(10000000001L); userInfo.setUserAccount("zhangsan"); userInfo.setUserName("张三"); String token = jwtConfig.createToken(new Gson() .toJson(userInfo)); System.out.println("token: " + token); boolean aBoolean = jwtConfig.isTokenExpired(jwtConfig.getExpirationDateFromToken(token)); System.out.println("aBoolean: " + aBoolean); System.out.println( "user: " + jwtConfig.getUserNameFromToken(token)); } }
2.5.1、运行结果
token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJ7XCJpZFwiOjEwMDAwMDAwMDAxLFwidXNlckFjY291bnRcIjpcInpoYW5nc2FuXCIsXCJ1c2VyTmFtZVwiOlwi5byg5LiJXCJ9IiwiaWF0IjoxNjg3MTY2MTc1LCJleHAiOjE2ODcxNjYxODV9.KZz-WrpslG3MOKyVd_9MXofCMh3STOvR3IwseRslreuYAS56UGuBBV6qVkHErLxxy3ELlRkWpiPZBj5eyFn2fw aBoolean: false user: {"id":10000000001,"userAccount":"zhangsan","userName":"张三"}
2.6、对外发布鉴权API - AuthController
- 提供【登录】接口,返回token信息
- 提供【token是否过期】接口,返回是否过期
package com.kelvin.authority.controller; /*** * @title AuthController * @desctption 用户鉴权API * @author Kelvin * @create 2023/6/8 9:40 **/ import com.kelvin.authority.config.JwtConfig; import com.kelvin.common.dto.TokenDTO; import com.kelvin.common.entity.UserInfo; import com.kelvin.common.http.HttpResultGenerator; import com.kelvin.common.http.ResultDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map; @CrossOrigin("*") @RestController @RequestMapping("/auth") public class AuthController { @Autowired private JwtConfig jwtConfig; @PostMapping("/login") public ResultDTO login(@RequestBody UserInfo userInfo){ String token = jwtConfig.createToken(userInfo.getUserAccount()); Map map = new HashMap(); map.put("token",token); return HttpResultGenerator.success(map); } /** * token是否过期 * @param token * @return */ @PostMapping("/isTokenExpiration") public Boolean isTokenExpiration(@RequestBody TokenDTO token){ return this.jwtConfig.isTokenExpired(this.jwtConfig.getExpirationDateFromToken(token.getToken())); } }
总结
以上就是今天要讲的内容,本文简单介绍了JWT的使用,对外提供提供【登录接口】、【token是否过期接口】,为分布式系统提供鉴权微服务功能。
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...