From bd50b1770996c29544739aee0127603a8e94cd7f Mon Sep 17 00:00:00 2001 From: qyx <565485304@qq.com> Date: Wed, 21 Aug 2024 14:30:02 +0800 Subject: [PATCH] =?UTF-8?q?feat(master):=20=E9=89=B4=E6=9D=83=E4=B8=AD?= =?UTF-8?q?=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 鉴权中心的代码实现-完成 --- ...roject_dev-protocol-springcloud_1.0.0.html | 1 + .../pom.xml | 18 ++++ .../controller/AuthorityController.java | 4 +- .../example/service/impl/JWTServiceImpl.java | 7 +- .../src/main/resources/http/authority.http | 8 +- .../src/test/java/org/example/DBDocTest.java | 86 +++++++++++++++++++ .../org/example/service/JWTServiceTest.java | 38 ++++++++ .../电商-授权鉴权服务.md | 9 +- .../org/example/utils/TokenParseUtils.java | 3 + 9 files changed, 162 insertions(+), 12 deletions(-) create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/doc/dev_protocol_springcloud_project_dev-protocol-springcloud_1.0.0.html create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/src/test/java/org/example/DBDocTest.java create mode 100644 dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/src/test/java/org/example/service/JWTServiceTest.java diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/doc/dev_protocol_springcloud_project_dev-protocol-springcloud_1.0.0.html b/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/doc/dev_protocol_springcloud_project_dev-protocol-springcloud_1.0.0.html new file mode 100644 index 0000000..f205b07 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/doc/dev_protocol_springcloud_project_dev-protocol-springcloud_1.0.0.html @@ -0,0 +1 @@ +数据库设计文档

数据库设计文档

数据库名:dev_protocol_springcloud_project
文档版本:1.0.0
文档描述:dev-protocol-springcloud
序号表名说明
1t_dev_protocol_cloud_user用户表
返回目录表名:t_dev_protocol_cloud_user
说明:用户表
数据列:
序号名称数据类型长度小数位允许空值主键默认值说明
1idbigint190NY自增主键
2usernamevarchar640NN用户名
3passwordvarchar2560NNMD5 加密之后的密码
4extra_infovarchar10240NN额外的信息
5create_timedatetime260NN0000-01-01 00:00:00创建时间
6update_timedatetime260NN0000-01-01 00:00:00更新时间
\ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/pom.xml b/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/pom.xml index f8c7596..0d0a3a0 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/pom.xml +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/pom.xml @@ -72,6 +72,24 @@ screw-core 1.0.3 + + + io.jsonwebtoken + jjwt-api + 0.10.5 + + + io.jsonwebtoken + jjwt-impl + 0.10.5 + runtime + + + io.jsonwebtoken + jjwt-jackson + 0.10.5 + runtime + KV + // jwt payload --> KV (用户数据) .claim(CommonConstant.JWT_USER_INFO_KEY, JSON.toJSONString(loginUserInfo)) - // jwt id + // jwt id (标识, 没什么作用) .setId(UUID.randomUUID().toString()) // jwt 过期时间 .setExpiration(expireDate) // jwt 签名 --> 加密 -// .signWith(getPrivateKey(), SignatureAlgorithm.RS256) + .signWith(SignatureAlgorithm.RS256, getPrivateKey()) .compact(); } diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/src/main/resources/http/authority.http b/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/src/main/resources/http/authority.http index cea788e..230e2ad 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/src/main/resources/http/authority.http +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/src/main/resources/http/authority.http @@ -1,18 +1,18 @@ ### 获取 Token -- 登录功能实现 -POST http://127.0.0.1:7000/ecommerce-authority-center/authority/token +POST http://127.0.0.1:7000/dev-protocol-springcloud-project-authority-center/authority/token Content-Type: application/json { - "username": "Qinyi02@imooc.com", + "username": "q@bbbbbbyyyyyy.com", "password": "25d55ad283aa400af464c76d713c07ad" } ### 注册用户并返回 Token -- 注册功能实现 -POST http://127.0.0.1:7000/ecommerce-authority-center/authority/register +POST http://127.0.0.1:7000/dev-protocol-springcloud-project-authority-center/authority/register Content-Type: application/json { - "username": "ImoocQinyiImooc@imooc.com", + "username": "qccc@11.com", "password": "25d55ad283aa400af464c76d713c07ad" } diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/src/test/java/org/example/DBDocTest.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/src/test/java/org/example/DBDocTest.java new file mode 100644 index 0000000..2d90a36 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/src/test/java/org/example/DBDocTest.java @@ -0,0 +1,86 @@ +package org.example; + +import cn.smallbun.screw.core.Configuration; +import cn.smallbun.screw.core.engine.EngineConfig; +import cn.smallbun.screw.core.engine.EngineFileType; +import cn.smallbun.screw.core.engine.EngineTemplateType; +import cn.smallbun.screw.core.execute.DocumentationExecute; +import cn.smallbun.screw.core.process.ProcessConfig; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.sql.DataSource; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +/** + *

数据库表文档生成

+ * */ +@SpringBootTest +@RunWith(SpringRunner.class) +public class DBDocTest { + + @Autowired + private ApplicationContext applicationContext; + + @Test + public void buildDBDoc() { + + DataSource dataSourceMysql = applicationContext.getBean(DataSource.class); + + // 生成文件配置 + EngineConfig engineConfig = EngineConfig.builder() + // 生成文件路径 + .fileOutputDir("C:\\Users\\Administrator\\Desktop\\study_pro\\dev-protocol\\dev-protocol-springcloud\\dev-protocol-springcloud-project-authority-center\\doc") + // 打开目录 + .openOutputDir(false) + // 文件类型 + .fileType(EngineFileType.HTML) + .produceType(EngineTemplateType.freemarker).build(); + + // 生成文档配置, 包含自定义版本号、描述等等 + // 数据库名_description_version.html + Configuration config = Configuration.builder() + .version("1.0.0") + .description("dev-protocol-springcloud") + .dataSource(dataSourceMysql) + .engineConfig(engineConfig) + .produceConfig(getProduceConfig()) + .build(); + + // 执行生成 + new DocumentationExecute(config).execute(); + } + + /** + *

配置想要生成的数据表和想要忽略的数据表

+ * */ + private ProcessConfig getProduceConfig() { + + // 想要忽略的数据表 + List ignoreTableName = Collections.singletonList("undo_log"); + // 忽略表前缀, 忽略 a、b 开头的数据库表 + List ignorePrefix = Arrays.asList("a", "b"); + // 忽略表后缀 + List ignoreSuffix = Arrays.asList("_test", "_Test"); + + return ProcessConfig.builder() + // 根据名称指定表生成 + .designatedTableName(Collections.emptyList()) + // 根据表前缀生成 + .designatedTablePrefix(Collections.emptyList()) + // 根据表后缀生成 + .designatedTableSuffix(Collections.emptyList()) + // 忽略表 + .ignoreTableName(ignoreTableName) + // 按照前缀忽略 + .ignoreTablePrefix(ignorePrefix) + // 按照后缀忽略 + .ignoreTableSuffix(ignoreSuffix) + .build(); + } +} diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/src/test/java/org/example/service/JWTServiceTest.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/src/test/java/org/example/service/JWTServiceTest.java new file mode 100644 index 0000000..6129811 --- /dev/null +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/src/test/java/org/example/service/JWTServiceTest.java @@ -0,0 +1,38 @@ +package org.example.service; + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.example.utils.TokenParseUtils; +import org.example.vo.LoginUserInfo; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +/** + *

JWT 相关服务测试类

+ * */ +@Slf4j +@SpringBootTest +@RunWith(SpringRunner.class) +public class JWTServiceTest { + + @Autowired + private IJWTService ijwtService; + + @Test + public void testGenerateAndParseToken() throws Exception { + + // 生成 token 返回给客户端 + String jwtToken = ijwtService.generateToken( + "q@bbbbbbyyyyyy.com", + "25d55ad283aa400af464c76d713c07ad" + ); + log.info("jwt token is: [{}]", jwtToken); + + // 客户端带 token 返回给我们的系统, 系统通过鉴权工具类解析, 得到用户信息 + LoginUserInfo userInfo = TokenParseUtils.parseUserInfoFromToken(jwtToken); + log.info("parse token: [{}]", JSON.toJSONString(userInfo)); + } +} \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/电商-授权鉴权服务.md b/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/电商-授权鉴权服务.md index 7c3e020..46e57b2 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/电商-授权鉴权服务.md +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-authority-center/电商-授权鉴权服务.md @@ -26,9 +26,12 @@ ## 生成 RSA256 公钥和私钥对 - [RSATest.java] - 一般是放在服务器上, 用的时候拉取下来使用 - ## 基于 JWT + RSA256 的授权 - +- 查看代码实现即可 ## 验证服务可用性 +- Test 验证 Service 功能可用性 +- http 脚本验证 对外接口是否可用 +## 授权、鉴权中心微服务总结 -## 授权、鉴权中心微服务总结 \ No newline at end of file +- 生成数据库 文档 + - [DBDocTest.java] \ No newline at end of file diff --git a/dev-protocol-springcloud/dev-protocol-springcloud-project-common/src/main/java/org/example/utils/TokenParseUtils.java b/dev-protocol-springcloud/dev-protocol-springcloud-project-common/src/main/java/org/example/utils/TokenParseUtils.java index 289a345..ee5aaa7 100644 --- a/dev-protocol-springcloud/dev-protocol-springcloud-project-common/src/main/java/org/example/utils/TokenParseUtils.java +++ b/dev-protocol-springcloud/dev-protocol-springcloud-project-common/src/main/java/org/example/utils/TokenParseUtils.java @@ -20,6 +20,9 @@ import java.util.Calendar; */ public class TokenParseUtils { + private TokenParseUtils() { + } + /** *

从 JWT Token 中解析 LoginUserInfo 对象

*/