Skip to content

Commit 7b538c2

Browse files
committed
网关认证登录供
1 parent d68c7b8 commit 7b538c2

93 files changed

Lines changed: 3371 additions & 558 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

data/sql/01.初始化业务数据库.sql

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ CREATE TABLE ums_member
4141
del_flag TINYINT(1) DEFAULT 0 COMMENT '删除标记(0-正常,1-删除)',
4242
create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
4343
update_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
44+
user_id VARCHAR(64) COMMENT '用户账户名',
4445
PRIMARY KEY (id)
4546
);
4647

@@ -250,3 +251,24 @@ CREATE TABLE chms_access_token
250251
ALTER TABLE chms_access_token COMMENT '渠道-认证表';
251252

252253

254+
255+
USE passjava_auth;
256+
257+
/*==============================================================*/
258+
/* Table: sys_user */
259+
/*==============================================================*/
260+
261+
DROP TABLE IF EXISTS `sys_user`;
262+
CREATE TABLE `sys_user` (
263+
`username` varchar(50) NOT NULL,
264+
`password` varchar(255) DEFAULT NULL,
265+
`org_id` int DEFAULT NULL,
266+
`enabled` bit(1) DEFAULT NULL,
267+
`phone` varchar(20) DEFAULT NULL,
268+
`email` varchar(50) DEFAULT NULL,
269+
`create_time` datetime DEFAULT NULL,
270+
`update_time` datetime DEFAULT NULL,
271+
`id` int NOT NULL AUTO_INCREMENT,
272+
`user_id` varchar(64) NOT NULL,
273+
PRIMARY KEY (`id`,`user_id`) USING BTREE
274+
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

data/sql/04.插入业务数据.sql

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
use passjava_ums;
2+
3+
BEGIN;
4+
INSERT INTO `ums_member` (`id`, `mini_openid`, `mp_openid`, `unionid`, `level_id`, `user_name`, `PASSWORD`, `nickname`, `phone`, `email`, `avatar`, `gender`, `birth`, `city`, `source_type`, `integration`, `register_time`, `del_flag`, `create_time`, `update_time`, `user_id`) VALUES (123, NULL, NULL, NULL, NULL, '悟空', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, '2022-08-12 16:22:53', '2022-08-12 16:22:53', 'wukong');
5+
COMMIT;
6+
7+
8+
use passjava_auth;
9+
10+
BEGIN;
11+
INSERT INTO `sys_user` (`username`, `password`, `org_id`, `enabled`, `phone`, `email`, `create_time`, `update_time`, `id`, `user_id`) VALUES ('wukong', '$2a$10$IAHUqoKYSgu/P0l9CiraTOQ/SJottVw9uS.QX9AS.NpZsLmtP5QgW', 1, b'1', '15912345678', 'abc@qq.com', '2022-08-10 07:20:30', '2022-08-10 07:24:33', 1, 'wukong');
12+
COMMIT;

passjava-auth/pom.xml

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<groupId>org.springframework.boot</groupId>
7+
<artifactId>spring-boot-starter-parent</artifactId>
8+
<version>2.2.6.RELEASE</version>
9+
<relativePath/> <!-- lookup parent from repository -->
10+
</parent>
11+
<modelVersion>4.0.0</modelVersion>
12+
<groupId>com.jackson0714.passjava</groupId>
13+
14+
<artifactId>passjava-auth</artifactId>
15+
<version>0.0.1-SNAPSHOT</version>
16+
<name>passjava-auth</name>
17+
<description>佳必过-认证服务</description>
18+
19+
<properties>
20+
<java.version>1.8</java.version>
21+
<spring-cloud.version>Hoxton.SR3</spring-cloud.version>
22+
</properties>
23+
24+
<dependencies>
25+
<dependency>
26+
<groupId>com.jackson0714.passjava</groupId>
27+
<artifactId>passjava-common</artifactId>
28+
<version>0.0.1-SNAPSHOT</version>
29+
</dependency>
30+
<dependency>
31+
<groupId>org.springframework.boot</groupId>
32+
<artifactId>spring-boot-starter-data-jpa</artifactId>
33+
</dependency>
34+
<dependency>
35+
<groupId>mysql</groupId>
36+
<artifactId>mysql-connector-java</artifactId>
37+
</dependency>
38+
<dependency>
39+
<groupId>org.springframework.boot</groupId>
40+
<artifactId>spring-boot-autoconfigure</artifactId>
41+
</dependency>
42+
<dependency>
43+
<groupId>org.springframework.boot</groupId>
44+
<artifactId>spring-boot-starter-web</artifactId>
45+
</dependency>
46+
<dependency>
47+
<groupId>org.apache.commons</groupId>
48+
<artifactId>commons-lang3</artifactId>
49+
</dependency>
50+
<dependency>
51+
<groupId>com.jackson0714.passjava</groupId>
52+
<artifactId>passjava-jwt</artifactId>
53+
<version>0.0.1-SNAPSHOT</version>
54+
<scope>compile</scope>
55+
</dependency>
56+
<dependency>
57+
<groupId>io.projectreactor</groupId>
58+
<artifactId>reactor-core</artifactId>
59+
</dependency>
60+
</dependencies>
61+
62+
<dependencyManagement>
63+
<dependencies>
64+
<dependency>
65+
<groupId>org.springframework.cloud</groupId>
66+
<artifactId>spring-cloud-dependencies</artifactId>
67+
<version>${spring-cloud.version}</version>
68+
<type>pom</type>
69+
<scope>import</scope>
70+
</dependency>
71+
</dependencies>
72+
</dependencyManagement>
73+
74+
<build>
75+
<plugins>
76+
<plugin>
77+
<groupId>org.springframework.boot</groupId>
78+
<artifactId>spring-boot-maven-plugin</artifactId>
79+
</plugin>
80+
</plugins>
81+
</build>
82+
</project>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.jackson0714.passjava.auth;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
6+
import org.springframework.cloud.context.config.annotation.RefreshScope;
7+
8+
/**
9+
* @author wukong
10+
*/
11+
@RefreshScope
12+
@EnableDiscoveryClient
13+
@SpringBootApplication(scanBasePackages = {"com.jackson0714.passjava"})
14+
public class PassjavaAuthApplication {
15+
16+
public static void main(String[] args) {
17+
SpringApplication.run(PassjavaAuthApplication.class, args);
18+
}
19+
20+
}
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
package com.jackson0714.passjava.auth.controller;
2+
3+
import com.jackson0714.passjava.common.utils.SecurityUtils;
4+
import com.jackson0714.passjava.jwt.common.ResponseCodeEnum;
5+
import com.jackson0714.passjava.jwt.config.PassJavaJwtProperties;
6+
import com.jackson0714.passjava.auth.jpa.SysUser;
7+
import com.jackson0714.passjava.auth.jpa.SysUserRepository;
8+
import com.jackson0714.passjava.jwt.utils.PassJavaJwtTokenUtil;
9+
import org.apache.commons.lang3.StringUtils;
10+
import org.springframework.security.crypto.password.PasswordEncoder;
11+
import org.springframework.web.bind.annotation.*;
12+
13+
import javax.annotation.Resource;
14+
import java.util.HashMap;
15+
import java.util.Map;
16+
import reactor.core.publisher.Mono;
17+
import com.jackson0714.passjava.jwt.common.ResponseResult;
18+
19+
/**
20+
* 获取 JWT 令牌和刷新 JWT 令牌接口
21+
*
22+
* @author 悟空聊架构
23+
* @site www.passjava.cn
24+
* @date 2022-08-09
25+
*
26+
* @startuml
27+
* @enduml
28+
*/
29+
@RestController
30+
@RequestMapping("/auth")
31+
//@ConditionalOnProperty(name = "passjava.gateway.jwt.useDefaultController", havingValue = "true")
32+
public class JwtAuthController {
33+
34+
@Resource
35+
private PassJavaJwtProperties jwtProperties;
36+
@Resource
37+
private SysUserRepository sysUserRepository;
38+
@Resource
39+
private PassJavaJwtTokenUtil jwtTokenUtil;
40+
@Resource
41+
private PasswordEncoder passwordEncoder;
42+
43+
/**
44+
* 使用用户名密码换 JWT 令牌
45+
*/
46+
@PostMapping("/login")
47+
public Mono<ResponseResult> login(@RequestBody Map<String,String> map){
48+
//从请求体中获取用户名密码
49+
String userId = map.get(jwtProperties.getUserParamName());
50+
String password = map.get(jwtProperties.getPwdParamName());
51+
52+
if(StringUtils.isEmpty(userId)
53+
|| StringUtils.isEmpty(password)){
54+
return buildErrorResponse(ResponseCodeEnum.LOGIN_ERROR);
55+
}
56+
//根据用户名(用户Id)去数据库查找该用户
57+
SysUser sysUser = sysUserRepository.findByUserId(userId);
58+
if(sysUser != null){
59+
//将数据库的加密密码与用户明文密码match
60+
boolean isAuthenticated = passwordEncoder.matches(password, sysUser.getPassword());
61+
//如果匹配成功
62+
if(isAuthenticated){
63+
// 通过 jwtTokenUtil 生成 JWT 令牌和刷新令牌
64+
Map<String, Object> tokenMap = jwtTokenUtil.generateTokenAndRefreshToken(userId, sysUser.getUsername());
65+
return buildSuccessResponse(tokenMap);
66+
} else{ //如果密码匹配失败
67+
return buildErrorResponse(ResponseCodeEnum.LOGIN_ERROR);
68+
}
69+
}else{
70+
return buildErrorResponse(ResponseCodeEnum.LOGIN_ERROR);
71+
}
72+
}
73+
74+
/**
75+
* 刷新JWT令牌,用旧的令牌换新的令牌
76+
*/
77+
@GetMapping("/refreshtoken")
78+
public Mono<ResponseResult> refreshtoken(@RequestHeader("${passjava.jwt.header}") String token){
79+
token = SecurityUtils.replaceTokenPrefix(token);
80+
81+
if (StringUtils.isEmpty(token)) {
82+
return buildErrorResponse(ResponseCodeEnum.TOKEN_MISSION);
83+
}
84+
85+
// 对Token解签名,并验证Token是否过期
86+
boolean isJwtNotValid = jwtTokenUtil.isTokenExpired(token);
87+
if(isJwtNotValid){
88+
return buildErrorResponse(ResponseCodeEnum.TOKEN_INVALID);
89+
}
90+
// 验证 token 里面的 userId 是否为空
91+
92+
String userId = jwtTokenUtil.getUserIdFromToken(token);
93+
String username = jwtTokenUtil.getUserNameFromToken(token);
94+
if (StringUtils.isEmpty(userId)) {
95+
return buildErrorResponse(ResponseCodeEnum.TOKEN_CHECK_INFO_FAILED);
96+
}
97+
98+
// 这里为了保证 refreshToken 只能用一次,刷新后,会从 redis 中删除。
99+
// 如果用的不是 redis 中的 refreshToken 进行刷新令牌,则不能刷新。
100+
// 如果使用 redis 中已过期的 refreshToken 也不能刷新令牌。
101+
boolean isRefreshTokenNotExisted = jwtTokenUtil.isRefreshTokenNotExistCache(token);
102+
if(isRefreshTokenNotExisted){
103+
return buildErrorResponse(ResponseCodeEnum.REFRESH_TOKEN_INVALID);
104+
}
105+
106+
String us = jwtTokenUtil.getUserIdFromToken(token);
107+
Map<String, Object> tokenMap = jwtTokenUtil.refreshTokenAndGenerateToken(userId, username);
108+
109+
return buildSuccessResponse(tokenMap);
110+
}
111+
112+
/**
113+
* 登出,删除 redis 中的 accessToken 和 refreshToken
114+
* 只保证 refreshToken 不能使用,accessToken 还是能使用的。
115+
* 如果用户拿到了之前的 accessToken,则可以一直使用到过期,但是因为 refreshToken 已经无法使用了,所以保证了 accessToken 的时效性。
116+
* 下次登录时,需要重新获取新的 accessToken 和 refreshToken,这样才能利用 refreshToken 进行续期。
117+
*/
118+
@PostMapping("/logout")
119+
public Mono<ResponseResult> logout(@RequestParam("username") String username){
120+
121+
boolean logoutResult = jwtTokenUtil.removeToken(username);
122+
if (logoutResult) {
123+
buildSuccessResponse(ResponseCodeEnum.SUCCESS);
124+
} else {
125+
buildErrorResponse(ResponseCodeEnum.LOGOUT_ERROR);
126+
}
127+
128+
return buildSuccessResponse(ResponseCodeEnum.SUCCESS);
129+
}
130+
131+
private Mono<ResponseResult> buildErrorResponse(ResponseCodeEnum responseCodeEnum){
132+
return Mono.create(callback -> callback.success(
133+
ResponseResult.error(responseCodeEnum.getCode(), responseCodeEnum.getMessage())
134+
));
135+
}
136+
137+
private Mono<ResponseResult> buildSuccessResponse(Object data){
138+
return Mono.create(callback -> callback.success(ResponseResult.success(data)
139+
));
140+
}
141+
142+
}

passjava-gateway/src/main/java/com/jackson0714/passjava/gateway/jpa/SysUser.java renamed to passjava-auth/src/main/java/com/jackson0714/passjava/auth/jpa/SysUser.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.jackson0714.passjava.gateway.jpa;
1+
package com.jackson0714.passjava.auth.jpa;
22

33
import lombok.AllArgsConstructor;
44
import lombok.Data;
@@ -24,11 +24,14 @@ public class SysUser {
2424

2525
@Id
2626
@GeneratedValue(strategy = GenerationType.IDENTITY)
27-
private String username;
27+
private String userId;
2828

2929
@Column
3030
private String password;
3131

32+
@Column
33+
private String username;
34+
3235
@Column
3336
private Integer orgId;
3437

passjava-gateway/src/main/java/com/jackson0714/passjava/gateway/jpa/SysUserRepository.java renamed to passjava-auth/src/main/java/com/jackson0714/passjava/auth/jpa/SysUserRepository.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
package com.jackson0714.passjava.gateway.jpa;
1+
package com.jackson0714.passjava.auth.jpa;
22

33
import org.springframework.data.jpa.repository.JpaRepository;
4-
import org.springframework.stereotype.Component;
54
import org.springframework.stereotype.Repository;
6-
import org.springframework.stereotype.Service;
75

86
/**
97
* 系统用户 repository
@@ -18,8 +16,8 @@ public interface SysUserRepository extends JpaRepository<SysUser,Long> {
1816
/**
1917
* 注意这个方法的名称,JPA 会根据方法名自动生成 SQL 执行,完全不用自己写SQL
2018
*
21-
* @param username 用户姓名
19+
* @param userId 用户姓名
2220
* @return SysUser
2321
*/
24-
SysUser findByUsername(String username);
22+
SysUser findByUserId(String userId);
2523
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
2+
spring.cloud.nacos.config.namespace=passjava-auth
3+
4+
spring.application.name=passjava-auth
5+
server.port=10001
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
spring:
2+
profiles:
3+
include: jwt
4+
datasource:
5+
url: jdbc:mysql://localhost:3306/passjava_auth?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
6+
username: root
7+
password: abc123__
8+
driver-class-name: com.mysql.cj.jdbc.Driver
9+
jpa:
10+
hibernate:
11+
ddl-auto: validate
12+
database: mysql
13+
show-sql: true
14+
15+
logging:
16+
level:
17+
com.jackson0714.passjava: debug

passjava-channel/src/main/java/com/jackson0714/passjava/channel/controller/AccessTokenController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212

1313
import com.jackson0714.passjava.channel.entity.AccessTokenEntity;
1414
import com.jackson0714.passjava.channel.service.AccessTokenService;
15-
import com.jackson0714.common.utils.PageUtils;
16-
import com.jackson0714.common.utils.R;
15+
import com.jackson0714.passjava.common.utils.PageUtils;
16+
import com.jackson0714.passjava.common.utils.R;
1717

1818

1919

0 commit comments

Comments
 (0)