《项目实战》构建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 <TODO description class purpose>* @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、公共库等

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.kelvin</groupId><artifactId>onlinestore</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>store-authority-service</artifactId><packaging>jar</packaging><name>authority-service</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.7.0</version></dependency><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>3.4.0</version></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>com.kelvin</groupId><artifactId>store-common</artifactId></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.7</version></dependency></dependencies>
</project>

2.3、修改application.yml配置

server:port: 7777
spring:application:name: store-auth-servicecloud: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_9MXofCMh3STOvR3IwseRslreuYAS56UGuBBV6qVkHErLxxy3ELlRkWpiPZBj5eyFn2fwaBoolean: falseuser: {"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 {@Autowiredprivate JwtConfig jwtConfig;@PostMapping("/login")public ResultDTO login(@RequestBody UserInfo userInfo){String token = jwtConfig.createToken(userInfo.getUserAccount());Map<String, String> map = new HashMap<String, String>();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是否过期接口】,为分布式系统提供鉴权微服务功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/13217.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑文件怎么加密?哪个文件加密软件好用?

不少人的电脑中都存放着一些重要文件&#xff0c;这些文件需要使用专业的方式进行加密保护。那么电脑文件该怎么加密呢&#xff1f;下面我们就通过本文来一起了解一下吧。 超级加密3000 作为一款备受好评的文件加密软件&#xff0c;超级加密3000在安全性、便捷性、全面性等方面…

记录征战Mini开发板从无到有

前言 我们店铺的开发板目前主要有Altera,Xilinx以及国产安路&#xff0c;高云。Xilinx只有Spartan6系列&#xff0c;这个系列的芯片只支持ISE软件&#xff0c;但是很多客户用的是VIVADO软件&#xff0c;所以导致我们无法满足客户的需求。基于此原因&#xff0c;我们经过几个月…

AST-抽象语法树

js加密解混淆首先想到的是AST语法树&#xff0c;那么什么是AST呢&#xff0c;学习AST过程的一些笔记 1.AST是JS执行的第一步是读取 js 文件中的字符流&#xff0c;然后通过词法分析生成令牌流Tokens&#xff0c;之后再通过语法分析生成 AST&#xff08;Abstract Syntax Tree&a…

读取摄像机的内参和畸变系数并对畸变图像进行去畸变

这个程序的目标是读取摄像机的参数(内参和畸变系数),并对畸变图像进行去畸变操作,然后进行一些特征点和矩形框的绘制。 #include 语句引入所需的库。using namespace std; 和 using namespace cv; 语句是在代码中使用std和opencv命名空间,这样就不用在每次使用这些库的函数…

ChatGPT 有什么新奇的使用方式?

先来看看ChatGPT对此问题如何作答 ChatGPT对此问题如何作答 ChatGPT是什么 ChatGPT是一种基于自然语言处理的语言模型&#xff0c;由OpenAI开发。它是建立在GPT&#xff08;Generative Pre-trained Transformer&#xff09;架构的基础上的&#xff0c;采用了深度学习技术。GP…

Todo-List案例版本一

初级使用e.target.value 记得安装npm i nanoid与UUID类似 快捷键ctrlH替换内容 src/components/MyHeader.vue <template><div class"todo-header"><input type"text" placeholder"请输入你的任务名称&#xff0c;按回车键确认&quo…

浅谈RPC协议

RPC协议 RPC简介为啥需要RPCRPC的调用过程gRPCProtoBuffergRPC实战 RPC简介 RPC&#xff08;Remote Procedure Call Protocol&#xff09;远程过程调用协议&#xff0c;目标就是让远程服务调用更加简单、透明。RPC 框架负责屏蔽底层的传输方式&#xff08;TCP 或者 UDP&#x…

《动手学深度学习》——线性神经网络

参考资料&#xff1a; 《动手学深度学习》 3.1 线性回归 3.1.1 线性回归的基本元素 样本&#xff1a; n n n 表示样本数&#xff0c; x ( i ) [ x 1 ( i ) , x 2 ( i ) , ⋯ , x d ( i ) ] x^{(i)}[x^{(i)}_1,x^{(i)}_2,\cdots,x^{(i)}_d] x(i)[x1(i)​,x2(i)​,⋯,xd(i)​…

特征选择算法 | Matlab实现基于ReliefF特征选择算法的分类数据特征选择 ReliefF

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 特征选择算法 | Matlab实现基于ReliefF特征选择算法的分类数据特征选择 ReliefF 部分源码 %--------------------

写一个starter(spring boot)

前置知识 自动装配 自动装配的一个重要注解就是SpringBootApplication。它是一个复合注解&#xff0c;由四个元注解和另外三个注解组成。这三个注解是&#xff1a; ConfigurationEnableAutoConfigurationComponentScan Configuration Configuration 是 JavaConfig 形式的…

神经网络之VGG

目录 1.VGG的简单介绍 1.2结构图 3.参考代码 VGGNet-16 架构&#xff1a;完整指南 |卡格尔 (kaggle.com) 1.VGG的简单介绍 经典卷积神经网络的基本组成部分是下面的这个序列&#xff1a; 带填充以保持分辨率的卷积层&#xff1b; 非线性激活函数&#xff0c;如ReLU&a…

web安全php基础_php变量命名及其作用域

php变量命名规则 php变量命名规则 变量以 $ 符号开始&#xff0c;后面跟着变量的名称变量名必须以字母或者下划线字符开始变量名只能包含字母数字字符以及下划线&#xff08;A-z、0-9 和 _ &#xff09;变量名不能包含空格变量名是区分大小写的&#xff08;$y 和 $Y 是两个不…