feat(master): 鉴权中心

鉴权中心的代码实现-完成
master
土豆兄弟 1 month ago
parent 5f96e63086
commit bd50b17709

@ -0,0 +1 @@
<html lang="zh"><head><title>数据库设计文档</title><style type='text/css'>body { padding-bottom: 50px } body, td { font-family: verdana, fantasy; font-size: 12px; line-height: 150% } table { width: 100%; background-color: #ccc; margin: 5px 0 } td { background-color: #fff; padding: 3px 3px 3px 10px } thead td { text-align: center; font-weight: bold; background-color: #eee } a:link, a:visited, a:active { color: #015fb6; text-decoration: none } a:hover { color: #e33e06 }</style></head><body style='text-align:center;'><div style='width:800px; margin:20px auto; text-align:left;'><a name='index'></a><h2 style='text-align:center; line-height:50px;'>数据库设计文档</h2><div><b>数据库名dev_protocol_springcloud_project</b><br><b>文档版本1.0.0</b><br><b>文档描述dev-protocol-springcloud</b><br></div><table cellspacing='1'><thead><tr><td style='width:40px; '>序号</td><td>表名</td><td>说明</td></tr></thead><tr><td style='text-align:center;'>1</td><td><a href='#t_dev_protocol_cloud_user'>t_dev_protocol_cloud_user</a></td><td>用户表</td></tr></table><a name='t_dev_protocol_cloud_user'></a><div style='margin-top:30px;'><a href='#index' style='float:right; margin-top:6px;'>返回目录</a><b>表名t_dev_protocol_cloud_user</b></div><div>说明:用户表</div><div>数据列:</div><table cellspacing='1'><thead><tr><td style='width:40px; '>序号</td><td>名称</td><td>数据类型</td><td>长度</td><td>小数位</td><td>允许空值</td><td>主键</td><td>默认值</td><td>说明</td></tr></thead><tr><td style='text-align:center;'>1</td><td>id</td><td align='center'>bigint</td><td align='center'>19</td><td align='center'>0</td><td align='center'>N</td><td align='center'>Y</td><td align='center'></td><td align='center'>自增主键</td></tr><tr><td style='text-align:center;'>2</td><td>username</td><td align='center'>varchar</td><td align='center'>64</td><td align='center'>0</td><td align='center'>N</td><td align='center'>N</td><td align='center'></td><td align='center'>用户名</td></tr><tr><td style='text-align:center;'>3</td><td>password</td><td align='center'>varchar</td><td align='center'>256</td><td align='center'>0</td><td align='center'>N</td><td align='center'>N</td><td align='center'></td><td align='center'>MD5 加密之后的密码</td></tr><tr><td style='text-align:center;'>4</td><td>extra_info</td><td align='center'>varchar</td><td align='center'>1024</td><td align='center'>0</td><td align='center'>N</td><td align='center'>N</td><td align='center'></td><td align='center'>额外的信息</td></tr><tr><td style='text-align:center;'>5</td><td>create_time</td><td align='center'>datetime</td><td align='center'>26</td><td align='center'>0</td><td align='center'>N</td><td align='center'>N</td><td align='center'>0000-01-01 00:00:00</td><td align='center'>创建时间</td></tr><tr><td style='text-align:center;'>6</td><td>update_time</td><td align='center'>datetime</td><td align='center'>26</td><td align='center'>0</td><td align='center'>N</td><td align='center'>N</td><td align='center'>0000-01-01 00:00:00</td><td align='center'>更新时间</td></tr></table></div><footer></footer></body></html>

@ -72,6 +72,24 @@
<artifactId>screw-core</artifactId> <artifactId>screw-core</artifactId>
<version>1.0.3</version> <version>1.0.3</version>
</dependency> </dependency>
<!-- 引入jwt-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.10.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.10.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.10.5</version>
<scope>runtime</scope>
</dependency>
</dependencies> </dependencies>
<!-- <!--

@ -28,7 +28,7 @@ public class AuthorityController {
/** /**
* <h2> Token (), </h2> * <h2> Token (), </h2>
* */ * */
@IgnoreResponseAdvice @IgnoreResponseAdvice // 不被统一响应解析
@PostMapping("/token") @PostMapping("/token")
public JwtToken token(@RequestBody UsernameAndPassword usernameAndPassword) public JwtToken token(@RequestBody UsernameAndPassword usernameAndPassword)
throws Exception { throws Exception {
@ -44,7 +44,7 @@ public class AuthorityController {
/** /**
* <h2> Token, </h2> * <h2> Token, </h2>
* */ * */
@IgnoreResponseAdvice @IgnoreResponseAdvice // 不被统一响应解析
@PostMapping("/register") @PostMapping("/register")
public JwtToken register(@RequestBody UsernameAndPassword usernameAndPassword) public JwtToken register(@RequestBody UsernameAndPassword usernameAndPassword)
throws Exception { throws Exception {

@ -25,6 +25,7 @@ import java.time.temporal.ChronoUnit;
import java.util.Date; import java.util.Date;
import java.util.UUID; import java.util.UUID;
/** /**
* <h1>JWT </h1> * <h1>JWT </h1>
* */ * */
@ -73,14 +74,14 @@ public class JWTServiceImpl implements IJWTService {
Date expireDate = Date.from(zdt.toInstant()); Date expireDate = Date.from(zdt.toInstant());
return Jwts.builder() return Jwts.builder()
// jwt payload --> KV // jwt payload --> KV (用户数据)
.claim(CommonConstant.JWT_USER_INFO_KEY, JSON.toJSONString(loginUserInfo)) .claim(CommonConstant.JWT_USER_INFO_KEY, JSON.toJSONString(loginUserInfo))
// jwt id // jwt id (标识, 没什么作用)
.setId(UUID.randomUUID().toString()) .setId(UUID.randomUUID().toString())
// jwt 过期时间 // jwt 过期时间
.setExpiration(expireDate) .setExpiration(expireDate)
// jwt 签名 --> 加密 // jwt 签名 --> 加密
// .signWith(getPrivateKey(), SignatureAlgorithm.RS256) .signWith(SignatureAlgorithm.RS256, getPrivateKey())
.compact(); .compact();
} }

@ -1,18 +1,18 @@
### 获取 Token -- 登录功能实现 ### 获取 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 Content-Type: application/json
{ {
"username": "Qinyi02@imooc.com", "username": "q@bbbbbbyyyyyy.com",
"password": "25d55ad283aa400af464c76d713c07ad" "password": "25d55ad283aa400af464c76d713c07ad"
} }
### 注册用户并返回 Token -- 注册功能实现 ### 注册用户并返回 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 Content-Type: application/json
{ {
"username": "ImoocQinyiImooc@imooc.com", "username": "qccc@11.com",
"password": "25d55ad283aa400af464c76d713c07ad" "password": "25d55ad283aa400af464c76d713c07ad"
} }

@ -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;
/**
* <h1></h1>
* */
@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();
}
/**
* <h2></h2>
* */
private ProcessConfig getProduceConfig() {
// 想要忽略的数据表
List<String> ignoreTableName = Collections.singletonList("undo_log");
// 忽略表前缀, 忽略 a、b 开头的数据库表
List<String> ignorePrefix = Arrays.asList("a", "b");
// 忽略表后缀
List<String> ignoreSuffix = Arrays.asList("_test", "_Test");
return ProcessConfig.builder()
// 根据名称指定表生成
.designatedTableName(Collections.emptyList())
// 根据表前缀生成
.designatedTablePrefix(Collections.emptyList())
// 根据表后缀生成
.designatedTableSuffix(Collections.emptyList())
// 忽略表
.ignoreTableName(ignoreTableName)
// 按照前缀忽略
.ignoreTablePrefix(ignorePrefix)
// 按照后缀忽略
.ignoreTableSuffix(ignoreSuffix)
.build();
}
}

@ -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;
/**
* <h1>JWT </h1>
* */
@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));
}
}

@ -26,9 +26,12 @@
## 生成 RSA256 公钥和私钥对 ## 生成 RSA256 公钥和私钥对
- [RSATest.java] - [RSATest.java]
- 一般是放在服务器上, 用的时候拉取下来使用 - 一般是放在服务器上, 用的时候拉取下来使用
## 基于 JWT + RSA256 的授权 ## 基于 JWT + RSA256 的授权
- 查看代码实现即可
## 验证服务可用性 ## 验证服务可用性
- Test 验证 Service 功能可用性
- http 脚本验证 对外接口是否可用
## 授权、鉴权中心微服务总结
## 授权、鉴权中心微服务总结 - 生成数据库 文档
- [DBDocTest.java]

@ -20,6 +20,9 @@ import java.util.Calendar;
*/ */
public class TokenParseUtils { public class TokenParseUtils {
private TokenParseUtils() {
}
/** /**
* <h2> JWT Token LoginUserInfo </h2> * <h2> JWT Token LoginUserInfo </h2>
*/ */

Loading…
Cancel
Save