《项目实战》构建SpringCloud alibaba项目(二、构建微服务鉴权子工程store-authority-service)

news2024/10/6 16:29:21

系列文章目录

构建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-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<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.coloradmin.cn/o/663389.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初识SLAM

SLAM的作用 想象一个叫小萝卜的机器人&#xff0c;小萝卜在未知环境走&#xff0c;肯定想让小萝卜在脑海中记住两件事&#xff1a; 1. 我在什么地方&#xff1f;——定位。 2. 周围环境是什么样&#xff1f;——建图。 这就和我们逛一个旅游景点一样&#xff0c;我们会潜意识…

清华青年AI自强作业hw3_3:用NN网络拟合MNIST手写数字分类

清华青年AI自强作业hw3_3&#xff1a;用NN网络拟合MNIST手写数字分类 实现过程具体思路多分类网络模型训练结果分析 相关链接 一起学AI系列博客&#xff1a;目录索引 hw3_3&#xff1a;用NN网络拟合MNIST手写数字分类 体会神经网络设计和TF框架编程 对比hw3_1两者的模型、效果…

CLIP和GPT

CLIP CLIP下游应用&#xff1a;VQGAN、DALL-ECLIP-Event:Connecting Text and Images with Event StructuresHierarchical Text-Conditional Image Generation with CLIP LatentsGPT系列算法GPT-1&#xff1a;GPT-2&#xff1a;GPT-3&#xff1a;GPT-3应用&#xff1a;Evaluati…

关于Win搜索太慢我自己写了一个Everything

文章目录 前言使用工具使用技术实现功能关于使用的技术比较OUTJDBC构建数据库FileMetasize处理文件最后修改时间equals重写其他方法 dao数据库源头获取连接关闭资源连接 FileDao初始化插入文件/目录到数据库中查询数据删除数据 特殊处理方法实现测试 服务初始化服务方法 操作单…

简要介绍 | 基于Python的图像形态学处理概述

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对基于Python的图像形态学处理进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 基于Python的图像形态学处理概述 Digital terrain models from airborne laser scanning for the automatic extra…

蓝牙芯片PHY6222的一些基本信息

摘要&#xff1a;本文简要介绍一下硬件工程师需要关注的PHY6222蓝牙芯片重点信息。 这个蓝牙芯片&#xff0c;支持蓝牙5.2. 内核是ARM Cortex™-M0 32-bit processor &#xff0c;这就证明它可以像开发STM32那样来为它开发程序。 具有SWD调试接口&#xff0c;那么就可以用少到…

论文解读:Splicing ViT Features for Semantic Appearance Transfer

Project webpage: https://splice-vit.github.io Abstruct 将两张图片中语义相近的目标的结构和风格&#xff08;外观&#xff09;拼接 • 输入一个 Structure/ Appearence 图像对 &#xff1a; 训练生成器 。 • 关键思想是利用 预训练 和固定的视觉转换器 ( ViT ) 模型&…

Smartbi内置用户登陆绕过漏洞复现

0x01 产品简介 Smartbi大数据分析产品融合BI定义的所有阶段&#xff0c;对接各种业务数据库、数据仓库和大数据分析平台&#xff0c;进行加工处理、分析挖掘和可视化展现&#xff1b;满足所有用户的各种数据分析应用需求&#xff0c;如大数据分析、可视化分析、探索式分析、复杂…

Push vs Pull

Push好在两点&#xff1a;1.把结果下推到下流节点&#xff0c;与控制流解耦合&#xff0c;有利于cache 2.对于有向无环图&#xff0c;而不仅仅是树的query plan有更好的效果 解释&#xff1a; pull伪代码 push 伪代码 解释一下push&#xff0c;就是把操作下推到叶子节点&#…

4-JVM类加载

目录 1.类加载过程 1.1.加载&#xff08;去车站&#xff09; 1.2.验证&#xff08;过安检&#xff09; 1.3.准备&#xff08;候车&#xff09; 1.4.解析&#xff08;检票&#xff09; 1.5.初始化&#xff08;上车&#xff09; 2.双亲委派模型 2.1.什么是双亲委派模型&a…

首次曝光!乔布斯这些从未公开的照片,揭露乔布斯的另一面

昨个&#xff0c;大神在群里分享了一本关于乔布斯的书籍。 这本书收录了他的照片、电子邮件、演讲稿和访谈&#xff0c;很多私人的邮件和访谈是第一次看到。 书中用乔布斯自己的视角&#xff0c;记录了他一生的轨迹&#xff0c;包括他的童年&#xff0c;创立、离开、重归苹果的…

【Matter】如何在Linux平台下测试Matter应用级通信(虚拟设备)

如何在Linux平台下测试Matter应用级通信(虚拟设备) 准备工作 1. 递归克隆Matter仓库 执行如下命令&#xff1a; git clone --recurse-submodules gitgithub.com:project-chip/connectedhomeip.git如果克隆过程中发生报错&#xff0c;请执行如下命令来同步子模块&#xff1a;…

【好书精读】网络是怎样连接的 之 委托协议栈发送消息

&#xff08;该图由AI制作 学习AI绘图 联系我&#xff09; 目录 数据收发操作概览 创建套接字阶段 连接阶段&#xff1a;把管道接上去 通信阶段&#xff1a;传递消息 断开阶段&#xff1a;收发数据结束 数据收发操作概览 知道了 IP 地址之后 &#xff0c; 就可以委托操…

Spring Boot高阶篇笔记

一、Spring Boot整合Redis缓存 JSR-107、Spring缓存抽象、整合Redis 1、JSR107 Java Caching定义了5个核心接口&#xff0c;分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry。 • CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应…

打造Top级期货交易系统!成为投资高手!

交易系统在期货市场中得到广泛的应用&#xff0c;技术分析是期货交易系统的重要组成部分之一。技术分析是依靠市场数据来预测未来期货行情的一种方法&#xff0c;通过对期货历史市场信息进行形态分析和统计计算等手段&#xff0c;获取市场行情的走向&#xff0c;为后续的期货交…

初识MFC第一天

文章目录 前言一、初识MFC二、初始相关API附录 前言 刚开始进入Win32开发时&#xff0c;会发现一些变量类型似乎在C语言中未曾见过。其实这些变量类型或是与C/C已有的数据类型相近的&#xff0c;是通过C语言的原始类型重新定义而成的。引入这些数据类型的主要目的是为了便于程…

2023届网课生就业难:挑战与策略探析

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

One-Class SVM详解

简介 One-Class SVM&#xff08;Support Vector Machine&#xff09;是一种无监督学习算法&#xff0c;用于异常检测和离群点检测。它的目标是通过仅使用正常数据来建模&#xff0c;识别出与正常模式不同的异常数据点。 One-Class SVM的工作原理如下&#xff1a; 数据映射&a…

潮玩盲盒APP系统开发

盲盒抽奖App软件界面应该包括以下几个部分&#xff1a; 首页&#xff1a;首页需要展示正在进行的抽奖活动、热门盲盒商品和刚刚开奖的中奖名单&#xff0c;让用户快速了解当前的热门活动和优惠。 抽奖详情页&#xff1a;抽奖详情页需要展示抽奖主题、奖品图片、中奖规则…

高频前端面试题汇总之计算机网络篇

一、HTTP协议 1. GET和POST的请求的区别 Post 和 Get 是 HTTP 请求的两种方法&#xff0c;其区别如下&#xff1a; 应用场景&#xff1a; GET 请求是一个幂等的请求&#xff0c;一般 Get 请求用于对服务器资源不会产生影响的场景&#xff0c;比如说请求一个网页的资源。而 P…