diff --git a/.idea/encodings.xml b/.idea/encodings.xml
index b0d0d5b..af260a6 100644
--- a/.idea/encodings.xml
+++ b/.idea/encodings.xml
@@ -3,6 +3,7 @@
+
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 15a25de..9319b69 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -7,6 +7,11 @@
+
diff --git a/aioj-backend-auth/pom.xml b/aioj-backend-auth/pom.xml
new file mode 100644
index 0000000..ce205b0
--- /dev/null
+++ b/aioj-backend-auth/pom.xml
@@ -0,0 +1,100 @@
+
+
+
+ 4.0.0
+
+ cn.meowrain
+ ai-oj
+ 1.0-SNAPSHOT
+
+
+ aioj-backend-auth
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+ org.springframework.boot
+ spring-boot-starter-oauth2-client
+
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ io.jsonwebtoken
+ jjwt-api
+ 0.13.0
+
+
+ io.jsonwebtoken
+ jjwt-impl
+ 0.13.0
+ runtime
+
+
+ io.jsonwebtoken
+ jjwt-jackson
+ 0.13.0
+ runtime
+
+
+
+ com.github.xiaoymin
+ knife4j-openapi3-jakarta-spring-boot-starter
+
+
+
+ cn.meowrain
+ aioj-backend-common
+ 1.0-SNAPSHOT
+ compile
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+ 4.3.0
+
+
+ org.springframework.cloud
+ spring-cloud-starter-loadbalancer
+ 4.3.0
+
+
+
\ No newline at end of file
diff --git a/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/AIOJAuthApplication.java b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/AIOJAuthApplication.java
new file mode 100644
index 0000000..1c3617a
--- /dev/null
+++ b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/AIOJAuthApplication.java
@@ -0,0 +1,13 @@
+package cn.meowrain.aioj.backend.auth;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+@EnableFeignClients(basePackages = "cn.meowrain.aioj.backend.auth.clients")
+@SpringBootApplication
+public class AIOJAuthApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(AIOJAuthApplication.class, args);
+ }
+}
diff --git a/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/clients/UserClient.java b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/clients/UserClient.java
new file mode 100644
index 0000000..3da69ce
--- /dev/null
+++ b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/clients/UserClient.java
@@ -0,0 +1,13 @@
+package cn.meowrain.aioj.backend.auth.clients;
+
+import cn.meowrain.aioj.backend.auth.dto.resp.UserAuthRespDTO;
+import cn.meowrain.aioj.backend.framework.web.Result;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(name = "user-service", path = "/api/v1/user")
+public interface UserClient {
+ @GetMapping("/inner/get-by-username")
+ Result getUserByUserName(@RequestParam("userAccount") String userAccount);
+}
diff --git a/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/common/enums/ChainMarkEnums.java b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/common/enums/ChainMarkEnums.java
new file mode 100644
index 0000000..8422705
--- /dev/null
+++ b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/common/enums/ChainMarkEnums.java
@@ -0,0 +1,20 @@
+package cn.meowrain.aioj.backend.auth.common.enums;
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+public enum ChainMarkEnums {
+ /**
+ * 用户登录请求验证
+ */
+ USER_LOGIN_REQ_PARAM_VERIFY("USER_LOGIN_REQ_PARAM_VERIFY");
+
+ @Getter
+ private final String markName;
+
+ @Override
+ public String toString() {
+ return markName;
+ }
+}
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/config/JwtPropertiesConfiguration.java b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/config/JwtPropertiesConfiguration.java
similarity index 90%
rename from aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/config/JwtPropertiesConfiguration.java
rename to aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/config/JwtPropertiesConfiguration.java
index e744365..eb5b4cc 100644
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/config/JwtPropertiesConfiguration.java
+++ b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/config/JwtPropertiesConfiguration.java
@@ -1,4 +1,4 @@
-package cn.meowrain.aioj.backend.userservice.config;
+package cn.meowrain.aioj.backend.auth.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/config/SecurityConfiguration.java b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/config/SecurityConfiguration.java
similarity index 74%
rename from aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/config/SecurityConfiguration.java
rename to aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/config/SecurityConfiguration.java
index e51c723..a26dfb2 100644
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/config/SecurityConfiguration.java
+++ b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/config/SecurityConfiguration.java
@@ -1,4 +1,4 @@
-package cn.meowrain.aioj.backend.userservice.config;
+package cn.meowrain.aioj.backend.auth.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -10,18 +10,10 @@ import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
-import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
-
-import cn.meowrain.aioj.backend.userservice.security.JwtAuthenticationFilter;
@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
- private final JwtAuthenticationFilter jwtAuthenticationFilter;
-
- public SecurityConfiguration(JwtAuthenticationFilter jwtAuthenticationFilter) {
- this.jwtAuthenticationFilter = jwtAuthenticationFilter;
- }
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
@@ -30,7 +22,7 @@ public class SecurityConfiguration {
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(auth -> auth
.requestMatchers(
- "/auth/**",
+ "/v1/auth/**",
"/doc.html",
"/swagger-ui/**",
"/swagger-resources/**",
@@ -39,8 +31,7 @@ public class SecurityConfiguration {
"/favicon.ico"
)
.permitAll()
- .anyRequest().authenticated())
- .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
+ .anyRequest().authenticated());
return http.build();
}
diff --git a/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/config/SwaggerConfiguration.java b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/config/SwaggerConfiguration.java
new file mode 100644
index 0000000..9a788a4
--- /dev/null
+++ b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/config/SwaggerConfiguration.java
@@ -0,0 +1,38 @@
+package cn.meowrain.aioj.backend.auth.config;
+
+import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Contact;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.info.License;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Slf4j
+@Configuration
+@EnableKnife4j
+public class SwaggerConfiguration implements ApplicationRunner {
+ @Value("${server.port:8080}")
+ private String serverPort;
+ @Value("${server.servlet.context-path:}")
+ private String contextPath;
+
+ @Bean
+ public OpenAPI customerOpenAPI() {
+ return new OpenAPI()
+ .info(new Info()
+ .title("AIOJ-renz微服务✨")
+ .description("用户认证功能")
+ .version("v1.0.0")
+ .contact(new Contact().name("meowrain").email("meowrain@126.com"))
+ .license(new License().name("MeowRain").url("https://meowrain.cn")));
+ }
+ @Override
+ public void run(ApplicationArguments args) throws Exception {
+ log.info("✨API Document: http://127.0.0.1:{}{}/doc.html", serverPort, contextPath);
+ }
+}
diff --git a/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/controller/AuthController.java b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/controller/AuthController.java
new file mode 100644
index 0000000..ccf7337
--- /dev/null
+++ b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/controller/AuthController.java
@@ -0,0 +1,35 @@
+package cn.meowrain.aioj.backend.auth.controller;
+
+import cn.meowrain.aioj.backend.auth.dto.req.UserLoginRequestDTO;
+import cn.meowrain.aioj.backend.auth.dto.resp.UserLoginResponseDTO;
+import cn.meowrain.aioj.backend.auth.service.AuthService;
+import cn.meowrain.aioj.backend.framework.web.Results;
+import cn.meowrain.aioj.backend.framework.web.Result;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/v1/auth")
+public class AuthController {
+
+ private final AuthService authService;
+
+ public AuthController(AuthService authService) {
+ this.authService = authService;
+ }
+
+ @PostMapping("/login")
+ public Result login(@RequestBody UserLoginRequestDTO userLoginRequest) {
+ UserLoginResponseDTO userLoginResponse = authService.userLogin(userLoginRequest);
+ return Results.success(userLoginResponse);
+
+ }
+
+ @PostMapping("/auth")
+ public Result auth(@RequestBody UserLoginRequestDTO userLoginRequest) {
+ UserLoginResponseDTO userLoginResponseDTO = authService.userLogin(userLoginRequest);
+ return Results.success(userLoginResponseDTO.getToken());
+ }
+}
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/chains/UserLoginRequestParamVerifyChain.java b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/dto/chains/UserLoginRequestParamVerifyChain.java
similarity index 79%
rename from aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/chains/UserLoginRequestParamVerifyChain.java
rename to aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/dto/chains/UserLoginRequestParamVerifyChain.java
index d8b7343..43ae17c 100644
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/chains/UserLoginRequestParamVerifyChain.java
+++ b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/dto/chains/UserLoginRequestParamVerifyChain.java
@@ -1,19 +1,19 @@
-package cn.meowrain.aioj.backend.userservice.dto.chains;
+package cn.meowrain.aioj.backend.auth.dto.chains;
+import cn.meowrain.aioj.backend.auth.common.enums.ChainMarkEnums;
+import cn.meowrain.aioj.backend.auth.dto.req.UserLoginRequestDTO;
import cn.meowrain.aioj.backend.framework.designpattern.chains.AbstractChianHandler;
import cn.meowrain.aioj.backend.framework.errorcode.ErrorCode;
import cn.meowrain.aioj.backend.framework.exception.ClientException;
-import cn.meowrain.aioj.backend.userservice.common.enums.ChainMarkEnums;
-import cn.meowrain.aioj.backend.userservice.dto.req.UserLoginRequest;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
@Component
@Slf4j
-public class UserLoginRequestParamVerifyChain implements AbstractChianHandler {
+public class UserLoginRequestParamVerifyChain implements AbstractChianHandler {
@Override
- public void handle(UserLoginRequest requestParam) {
+ public void handle(UserLoginRequestDTO requestParam) {
if (StringUtils.isAnyBlank(requestParam.getUserAccount(), requestParam.getUserPassword())) {
throw new ClientException("参数为空", ErrorCode.PARAMS_ERROR);
}
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/chains/context/UserLoginRequestParamVerifyContext.java b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/dto/chains/context/UserLoginRequestParamVerifyContext.java
similarity index 55%
rename from aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/chains/context/UserLoginRequestParamVerifyContext.java
rename to aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/dto/chains/context/UserLoginRequestParamVerifyContext.java
index d4ea053..ac4dbe4 100644
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/chains/context/UserLoginRequestParamVerifyContext.java
+++ b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/dto/chains/context/UserLoginRequestParamVerifyContext.java
@@ -1,9 +1,9 @@
-package cn.meowrain.aioj.backend.userservice.dto.chains.context;
+package cn.meowrain.aioj.backend.auth.dto.chains.context;
+import cn.meowrain.aioj.backend.auth.dto.req.UserLoginRequestDTO;
import cn.meowrain.aioj.backend.framework.designpattern.chains.CommonChainContext;
-import cn.meowrain.aioj.backend.userservice.dto.req.UserLoginRequest;
import org.springframework.stereotype.Component;
@Component
-public class UserLoginRequestParamVerifyContext extends CommonChainContext {
+public class UserLoginRequestParamVerifyContext extends CommonChainContext {
}
diff --git a/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/dto/req/UserLoginRequestDTO.java b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/dto/req/UserLoginRequestDTO.java
new file mode 100644
index 0000000..5b43e1d
--- /dev/null
+++ b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/dto/req/UserLoginRequestDTO.java
@@ -0,0 +1,9 @@
+package cn.meowrain.aioj.backend.auth.dto.req;
+
+import lombok.Data;
+
+@Data
+public class UserLoginRequestDTO {
+ private String userAccount;
+ private String userPassword;
+}
diff --git a/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/dto/resp/UserAuthRespDTO.java b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/dto/resp/UserAuthRespDTO.java
new file mode 100644
index 0000000..a970188
--- /dev/null
+++ b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/dto/resp/UserAuthRespDTO.java
@@ -0,0 +1,68 @@
+package cn.meowrain.aioj.backend.auth.dto.resp;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 用户认证响应体
+ */
+@Data
+public class UserAuthRespDTO {
+
+ /**
+ * id
+ */
+ private Long id;
+
+ /**
+ * 用户账号
+ */
+ private String userAccount;
+ /**
+ * 用户密码
+ */
+ private String userPassword;
+
+ /**
+ * 开放平台id
+ */
+ private String unionId;
+
+ /**
+ * 公众号openId
+ */
+ private String mpOpenId;
+
+ /**
+ * 用户昵称
+ */
+ private String userName;
+
+ /**
+ * 用户头像
+ */
+ private String userAvatar;
+
+ /**
+ * 用户简介
+ */
+ private String userProfile;
+
+ /**
+ * 用户角色:user/admin/ban
+ */
+ private String userRole;
+
+ /**
+ * 创建时间
+ */
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ private Date updateTime;
+
+
+}
diff --git a/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/dto/resp/UserLoginResponseDTO.java b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/dto/resp/UserLoginResponseDTO.java
new file mode 100644
index 0000000..d9f0d7e
--- /dev/null
+++ b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/dto/resp/UserLoginResponseDTO.java
@@ -0,0 +1,73 @@
+package cn.meowrain.aioj.backend.auth.dto.resp;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+public class UserLoginResponseDTO implements Serializable {
+ /**
+ * id
+ */
+ private Long id;
+
+ /**
+ * 用户账号
+ */
+ private String userAccount;
+
+ /**
+ * 开放平台id
+ */
+ private String unionId;
+
+ /**
+ * 公众号openId
+ */
+ private String mpOpenId;
+
+ /**
+ * 用户昵称
+ */
+ private String userName;
+
+ /**
+ * 用户头像
+ */
+ private String userAvatar;
+
+ /**
+ * 用户简介
+ */
+ private String userProfile;
+
+ /**
+ * 用户角色:user/admin/ban
+ */
+ private String userRole;
+
+ /**
+ * 创建时间
+ */
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ private Date updateTime;
+
+ /**
+ * 是否删除
+ */
+
+ private Integer isDelete;
+
+
+ /**
+ * JWT令牌(登录成功返回)
+ */
+ private String token;
+
+ private static final long serialVersionUID = 1L;
+}
diff --git a/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/service/AuthService.java b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/service/AuthService.java
new file mode 100644
index 0000000..92cf15c
--- /dev/null
+++ b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/service/AuthService.java
@@ -0,0 +1,14 @@
+package cn.meowrain.aioj.backend.auth.service;
+
+import cn.meowrain.aioj.backend.auth.dto.req.UserLoginRequestDTO;
+import cn.meowrain.aioj.backend.auth.dto.resp.UserLoginResponseDTO;
+
+public interface AuthService {
+ /**
+ * 用户登录
+ * @param request {@link UserLoginRequestDTO}
+ * @return {@link UserLoginResponseDTO}
+ */
+ UserLoginResponseDTO userLogin(UserLoginRequestDTO request);
+
+}
diff --git a/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/service/impl/AuthServiceImpl.java b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/service/impl/AuthServiceImpl.java
new file mode 100644
index 0000000..f1aaf7b
--- /dev/null
+++ b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/service/impl/AuthServiceImpl.java
@@ -0,0 +1,58 @@
+package cn.meowrain.aioj.backend.auth.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.crypto.digest.BCrypt;
+import cn.meowrain.aioj.backend.auth.clients.UserClient;
+import cn.meowrain.aioj.backend.auth.common.enums.ChainMarkEnums;
+import cn.meowrain.aioj.backend.auth.dto.chains.context.UserLoginRequestParamVerifyContext;
+import cn.meowrain.aioj.backend.auth.dto.req.UserLoginRequestDTO;
+import cn.meowrain.aioj.backend.auth.dto.resp.UserAuthRespDTO;
+import cn.meowrain.aioj.backend.auth.dto.resp.UserLoginResponseDTO;
+import cn.meowrain.aioj.backend.auth.service.AuthService;
+import cn.meowrain.aioj.backend.auth.utils.JwtUtil;
+import cn.meowrain.aioj.backend.framework.errorcode.ErrorCode;
+import cn.meowrain.aioj.backend.framework.exception.ServiceException;
+import cn.meowrain.aioj.backend.framework.web.Result;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+@Slf4j
+public class AuthServiceImpl implements AuthService {
+ private final JwtUtil jwtUtil;
+ private final UserLoginRequestParamVerifyContext userLoginRequestParamVerifyContext;
+ private final UserClient userClient;
+
+ @Override
+ public UserLoginResponseDTO userLogin(UserLoginRequestDTO requestParam) {
+ // 1.校验
+ userLoginRequestParamVerifyContext.handler(ChainMarkEnums.USER_LOGIN_REQ_PARAM_VERIFY.getMarkName(),
+ requestParam);
+ // 如果调用user-service失败,那么就说明是系统内部错误
+ Result userResp = userClient.getUserByUserName(requestParam.getUserAccount());
+ if (userResp.isFail()) {
+ log.error("调用user-service返回失败:{}", userResp.getMessage());
+ throw new ServiceException(ErrorCode.SYSTEM_ERROR);
+ }
+ UserAuthRespDTO user = userResp.getData();
+
+ if (ObjectUtil.isNull(user)
+ || !BCrypt.checkpw(requestParam.getUserPassword(), user.getUserPassword())) {
+ throw new ServiceException("用户不存在或者密码错误", ErrorCode.NOT_LOGIN_ERROR);
+ }
+ // 生成 JWT
+ String token = jwtUtil.generateToken(user);
+ UserLoginResponseDTO resp = new UserLoginResponseDTO();
+ resp.setId(user.getId());
+ resp.setUserAccount(user.getUserAccount());
+ resp.setUserAvatar(user.getUserAvatar());
+ resp.setUserProfile(user.getUserProfile());
+ resp.setUserRole(user.getUserRole());
+ resp.setCreateTime(user.getCreateTime());
+ resp.setUpdateTime(user.getUpdateTime());
+ resp.setToken(token);
+ return resp;
+ }
+}
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/utils/JwtUtil.java b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/utils/JwtUtil.java
similarity index 87%
rename from aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/utils/JwtUtil.java
rename to aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/utils/JwtUtil.java
index e4702c8..2382d65 100644
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/utils/JwtUtil.java
+++ b/aioj-backend-auth/src/main/java/cn/meowrain/aioj/backend/auth/utils/JwtUtil.java
@@ -1,7 +1,7 @@
-package cn.meowrain.aioj.backend.userservice.utils;
+package cn.meowrain.aioj.backend.auth.utils;
-import cn.meowrain.aioj.backend.userservice.config.JwtPropertiesConfiguration;
-import cn.meowrain.aioj.backend.userservice.dao.entity.User;
+import cn.meowrain.aioj.backend.auth.config.JwtPropertiesConfiguration;
+import cn.meowrain.aioj.backend.auth.dto.resp.UserAuthRespDTO;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
@@ -25,7 +25,7 @@ public class JwtUtil {
return Keys.hmacShaKeyFor(jwtConfig.getSecret().getBytes());
}
- public String generateToken(User user) {
+ public String generateToken(UserAuthRespDTO user) {
long now = System.currentTimeMillis();
Map claims = new HashMap<>();
claims.put("userId", user.getId());
diff --git a/aioj-backend-auth/src/main/resources/application-dev.yml b/aioj-backend-auth/src/main/resources/application-dev.yml
new file mode 100644
index 0000000..94b9104
--- /dev/null
+++ b/aioj-backend-auth/src/main/resources/application-dev.yml
@@ -0,0 +1,9 @@
+spring:
+ cloud:
+ nacos:
+ discovery:
+ enabled: true
+ register-enabled: true
+ server-addr: 10.0.0.10:8848
+ username: nacos
+ password: nacos
\ No newline at end of file
diff --git a/aioj-backend-auth/src/main/resources/application-prod.yml b/aioj-backend-auth/src/main/resources/application-prod.yml
new file mode 100644
index 0000000..e69de29
diff --git a/aioj-backend-auth/src/main/resources/application-test.yaml b/aioj-backend-auth/src/main/resources/application-test.yaml
new file mode 100644
index 0000000..e69de29
diff --git a/aioj-backend-auth/src/main/resources/application.yml b/aioj-backend-auth/src/main/resources/application.yml
new file mode 100644
index 0000000..571f68a
--- /dev/null
+++ b/aioj-backend-auth/src/main/resources/application.yml
@@ -0,0 +1,37 @@
+spring:
+ application:
+ name: auth-service
+ profiles:
+ active: @env@
+ devtools:
+ livereload:
+ enabled: true
+server:
+ port: 10011
+ servlet:
+ context-path: /api
+springdoc:
+ api-docs:
+ enabled: true
+ path: /v3/api-docs
+ default-flat-param-object: true
+ swagger-ui:
+ path: /swagger-ui.html
+ tags-sorter: alpha
+ operations-sorter: alpha
+ group-configs:
+ - group: 'default'
+ paths-to-match: '/**'
+ packages-to-scan: cn.meowrain.aioj.backend.userservice.controller
+knife4j:
+ basic:
+ enable: true
+ setting:
+ language: zh_cn
+mybatis-plus:
+ configuration:
+ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+ mapper-locations: classpath*:/mapper/**/*.xml
+jwt:
+ secret: "12345678901234567890123456789012" # 至少32字节!!
+ expire: 86400000 # 24小时(单位:毫秒)
\ No newline at end of file
diff --git a/aioj-backend-gateway/pom.xml b/aioj-backend-gateway/pom.xml
index 769b8fb..8128d6b 100644
--- a/aioj-backend-gateway/pom.xml
+++ b/aioj-backend-gateway/pom.xml
@@ -1,7 +1,7 @@
+ 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">
4.0.0
cn.meowrain
@@ -41,5 +41,14 @@
com.alibaba.cloud
spring-cloud-alibaba-sentinel-gateway
+
+ com.alibaba.csp
+ sentinel-datasource-extension
+
+
+
+ com.github.xiaoymin
+ knife4j-openapi3-jakarta-spring-boot-starter
+
\ No newline at end of file
diff --git a/aioj-backend-gateway/src/main/resources/application-dev.yml b/aioj-backend-gateway/src/main/resources/application-dev.yml
index e69de29..c817fc0 100644
--- a/aioj-backend-gateway/src/main/resources/application-dev.yml
+++ b/aioj-backend-gateway/src/main/resources/application-dev.yml
@@ -0,0 +1,14 @@
+spring:
+ data:
+ redis:
+ host: 10.0.0.10
+ port: 6379
+ password: 123456
+ cloud:
+ nacos:
+ discovery:
+ enabled: true
+ register-enabled: true
+ server-addr: 10.0.0.10:8848
+ username: nacos
+ password: nacos
\ No newline at end of file
diff --git a/aioj-backend-model/pom.xml b/aioj-backend-model/pom.xml
deleted file mode 100644
index e28a190..0000000
--- a/aioj-backend-model/pom.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
- 4.0.0
-
- cn.meowrain
- ai-oj
- 1.0-SNAPSHOT
-
-
- aioj-backend-model
-
-
- 17
- 17
- UTF-8
-
-
-
\ No newline at end of file
diff --git a/aioj-backend-user-service/pom.xml b/aioj-backend-user-service/pom.xml
index 3792fbb..bb27d4e 100644
--- a/aioj-backend-user-service/pom.xml
+++ b/aioj-backend-user-service/pom.xml
@@ -32,17 +32,6 @@
aioj-backend-common
1.0-SNAPSHOT
-
-
- org.springframework.boot
- spring-boot-starter-security
-
-
-
-
- org.springframework.boot
- spring-boot-starter-oauth2-client
-
com.baomidou
@@ -81,23 +70,5 @@
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
-
-
- io.jsonwebtoken
- jjwt-api
- 0.13.0
-
-
- io.jsonwebtoken
- jjwt-impl
- 0.13.0
- runtime
-
-
- io.jsonwebtoken
- jjwt-jackson
- 0.13.0
- runtime
-
\ No newline at end of file
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/config/FrameworkConfiguration.java b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/config/FrameworkConfiguration.java
index 0cb15b2..acdb4c0 100644
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/config/FrameworkConfiguration.java
+++ b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/config/FrameworkConfiguration.java
@@ -1,6 +1,5 @@
package cn.meowrain.aioj.backend.userservice.config;
-import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScans;
import org.springframework.context.annotation.Configuration;
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/controller/UserController.java b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/controller/UserController.java
index 7c8c633..bbb47d9 100644
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/controller/UserController.java
+++ b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/controller/UserController.java
@@ -2,35 +2,31 @@ package cn.meowrain.aioj.backend.userservice.controller;
import cn.meowrain.aioj.backend.framework.web.Result;
import cn.meowrain.aioj.backend.framework.web.Results;
-import cn.meowrain.aioj.backend.userservice.dto.req.UserLoginRequest;
-import cn.meowrain.aioj.backend.userservice.dto.req.UserRegisterRequest;
-import cn.meowrain.aioj.backend.userservice.dto.resp.UserLoginResponse;
+import cn.meowrain.aioj.backend.userservice.dto.req.UserRegisterRequestDTO;
+import cn.meowrain.aioj.backend.userservice.dto.resp.UserAuthRespDTO;
import cn.meowrain.aioj.backend.userservice.service.UserService;
import lombok.RequiredArgsConstructor;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
@RequiredArgsConstructor
@RestController()
-@RequestMapping("/auth")
+@RequestMapping("/v1/user")
public class UserController {
private final UserService userService;
@PostMapping("/register")
- public Result register(@RequestBody UserRegisterRequest userRegisterRequest) {
+ public Result register(@RequestBody UserRegisterRequestDTO userRegisterRequest) {
Long l = userService.userRegister(userRegisterRequest);
return Results.success(l);
}
- @PostMapping("/login")
- public Result login(@RequestBody UserLoginRequest userLoginRequest) {
- UserLoginResponse userLoginResponse = userService.userLogin(userLoginRequest);
- return Results.success(userLoginResponse);
-
+ @GetMapping("/inner/get-by-username")
+ public Result getUserByUserName(@RequestParam("userAccount") String userAccount) {
+ UserAuthRespDTO userAuthDTO = userService.findAuthInfoByUserAccount(userAccount);
+ return Results.success(userAuthDTO);
}
+
}
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/chains/UserRegisterRequestParamVerifyChain.java b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/chains/UserRegisterRequestParamVerifyChain.java
index e883a98..3c5a1a7 100644
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/chains/UserRegisterRequestParamVerifyChain.java
+++ b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/chains/UserRegisterRequestParamVerifyChain.java
@@ -4,16 +4,16 @@ import cn.meowrain.aioj.backend.framework.designpattern.chains.AbstractChianHand
import cn.meowrain.aioj.backend.framework.errorcode.ErrorCode;
import cn.meowrain.aioj.backend.framework.exception.ClientException;
import cn.meowrain.aioj.backend.userservice.common.enums.ChainMarkEnums;
-import cn.meowrain.aioj.backend.userservice.dto.req.UserRegisterRequest;
+import cn.meowrain.aioj.backend.userservice.dto.req.UserRegisterRequestDTO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
@Component
@Slf4j
-public class UserRegisterRequestParamVerifyChain implements AbstractChianHandler {
+public class UserRegisterRequestParamVerifyChain implements AbstractChianHandler {
@Override
- public void handle(UserRegisterRequest requestParam) {
+ public void handle(UserRegisterRequestDTO requestParam) {
// 校验参数里面用户名和密码是不是空的
if (StringUtils.isAnyBlank(requestParam.getUserAccount(), requestParam.getUserPassword())) {
throw new ClientException("参数为空", ErrorCode.PARAMS_ERROR);
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/chains/context/UserRegisterRequestParamVerifyContext.java b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/chains/context/UserRegisterRequestParamVerifyContext.java
index fa94e94..f2931af 100644
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/chains/context/UserRegisterRequestParamVerifyContext.java
+++ b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/chains/context/UserRegisterRequestParamVerifyContext.java
@@ -1,9 +1,9 @@
package cn.meowrain.aioj.backend.userservice.dto.chains.context;
import cn.meowrain.aioj.backend.framework.designpattern.chains.CommonChainContext;
-import cn.meowrain.aioj.backend.userservice.dto.req.UserRegisterRequest;
+import cn.meowrain.aioj.backend.userservice.dto.req.UserRegisterRequestDTO;
import org.springframework.stereotype.Component;
@Component
-public class UserRegisterRequestParamVerifyContext extends CommonChainContext {
+public class UserRegisterRequestParamVerifyContext extends CommonChainContext {
}
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/req/UserLoginRequest.java b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/req/UserLoginRequestDTO.java
similarity index 84%
rename from aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/req/UserLoginRequest.java
rename to aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/req/UserLoginRequestDTO.java
index 372f5a5..242db16 100644
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/req/UserLoginRequest.java
+++ b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/req/UserLoginRequestDTO.java
@@ -4,7 +4,7 @@ import jakarta.servlet.http.HttpServletRequest;
import lombok.Data;
@Data
-public class UserLoginRequest {
+public class UserLoginRequestDTO {
private String userAccount;
private String userPassword;
}
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/req/UserRegisterRequest.java b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/req/UserRegisterRequestDTO.java
similarity index 85%
rename from aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/req/UserRegisterRequest.java
rename to aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/req/UserRegisterRequestDTO.java
index 32239d0..62ff602 100644
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/req/UserRegisterRequest.java
+++ b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/req/UserRegisterRequestDTO.java
@@ -4,7 +4,7 @@ import lombok.Data;
import lombok.NoArgsConstructor;
@Data
-public class UserRegisterRequest {
+public class UserRegisterRequestDTO {
private String userAccount;
private String userPassword;
private String checkPassword;
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/resp/UserAuthRespDTO.java b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/resp/UserAuthRespDTO.java
new file mode 100644
index 0000000..497212b
--- /dev/null
+++ b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/resp/UserAuthRespDTO.java
@@ -0,0 +1,69 @@
+package cn.meowrain.aioj.backend.userservice.dto.resp;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 用户认证响应体
+ */
+@Data
+public class UserAuthRespDTO {
+
+ /**
+ * id
+ */
+ private Long id;
+
+ /**
+ * 用户账号
+ */
+ private String userAccount;
+ /**
+ * 用户密码
+ */
+ private String userPassword;
+
+ /**
+ * 开放平台id
+ */
+ private String unionId;
+
+ /**
+ * 公众号openId
+ */
+ private String mpOpenId;
+
+ /**
+ * 用户昵称
+ */
+ private String userName;
+
+ /**
+ * 用户头像
+ */
+ private String userAvatar;
+
+ /**
+ * 用户简介
+ */
+ private String userProfile;
+
+ /**
+ * 用户角色:user/admin/ban
+ */
+ private String userRole;
+
+ /**
+ * 创建时间
+ */
+ private Date createTime;
+
+ /**
+ * 更新时间
+ */
+ private Date updateTime;
+
+
+
+}
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/resp/UserLoginResponse.java b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/resp/UserLoginResponseDTO.java
similarity index 94%
rename from aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/resp/UserLoginResponse.java
rename to aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/resp/UserLoginResponseDTO.java
index b8ca516..1707f4c 100644
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/resp/UserLoginResponse.java
+++ b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/resp/UserLoginResponseDTO.java
@@ -7,7 +7,7 @@ import java.io.Serializable;
import java.util.Date;
@Data
-public class UserLoginResponse implements Serializable {
+public class UserLoginResponseDTO implements Serializable {
/**
* id
*/
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/resp/UserRegisterResponse.java b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/resp/UserRegisterResponseDTO.java
similarity index 76%
rename from aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/resp/UserRegisterResponse.java
rename to aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/resp/UserRegisterResponseDTO.java
index a4ef950..2db22dc 100644
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/resp/UserRegisterResponse.java
+++ b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/dto/resp/UserRegisterResponseDTO.java
@@ -8,6 +8,6 @@ import java.io.Serializable;
* 用户注册成功响应对象
*/
@Data
-public class UserRegisterResponse implements Serializable {
+public class UserRegisterResponseDTO implements Serializable {
private static final long serialVersionUID = 1L;
}
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/security/CustomUserDetailsService.java b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/security/CustomUserDetailsService.java
deleted file mode 100644
index d3e8827..0000000
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/security/CustomUserDetailsService.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package cn.meowrain.aioj.backend.userservice.security;
-
-import cn.meowrain.aioj.backend.userservice.dao.entity.User;
-import cn.meowrain.aioj.backend.userservice.dao.mapper.UserMapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
-
-import java.util.Collection;
-import java.util.Collections;
-
-@Service
-public class CustomUserDetailsService implements UserDetailsService {
- private final UserMapper userMapper;
-
- public CustomUserDetailsService(UserMapper userMapper) {
- this.userMapper = userMapper;
- }
-
- @Override
- public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
- User user = userMapper.selectOne(Wrappers.lambdaQuery(User.class).eq(User::getUserAccount, username));
- if (user == null) {
- throw new UsernameNotFoundException("用户不存在: " + username);
- }
- Collection extends GrantedAuthority> authorities = Collections
- .singletonList(new SimpleGrantedAuthority(user.getUserRole()));
- return new org.springframework.security.core.userdetails.User(user.getUserAccount(), user.getUserPassword(),
- authorities);
- }
-}
\ No newline at end of file
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/security/JwtAuthenticationFilter.java b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/security/JwtAuthenticationFilter.java
deleted file mode 100644
index 7f676cd..0000000
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/security/JwtAuthenticationFilter.java
+++ /dev/null
@@ -1,76 +0,0 @@
-package cn.meowrain.aioj.backend.userservice.security;
-
-import cn.meowrain.aioj.backend.userservice.dao.entity.User;
-import cn.meowrain.aioj.backend.userservice.dao.mapper.UserMapper;
-import cn.meowrain.aioj.backend.userservice.utils.JwtUtil;
-import io.jsonwebtoken.Claims;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.context.SecurityContextHolder;
-import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
-import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
-import org.springframework.web.filter.OncePerRequestFilter;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-
-/**
- * JWT请求过滤器:解析 Authorization 头中的 Bearer token 并设置认证上下文
- */
-@Component
-public class JwtAuthenticationFilter extends OncePerRequestFilter {
-
- private final JwtUtil jwtUtil;
- private final UserMapper userMapper;
-
- public JwtAuthenticationFilter(JwtUtil jwtUtil, UserMapper userMapper) {
- this.jwtUtil = jwtUtil;
- this.userMapper = userMapper;
- }
-
- @Override
- protected void doFilterInternal(HttpServletRequest request,
- HttpServletResponse response,
- FilterChain filterChain) throws ServletException, IOException {
- String header = request.getHeader("Authorization");
- if (!StringUtils.hasText(header) || !header.startsWith("Bearer ")) {
- filterChain.doFilter(request, response);
- return;
- }
- String token = header.substring(7);
- if (!jwtUtil.isTokenValid(token)) {
- filterChain.doFilter(request, response);
- return;
- }
- try {
- Claims claims = jwtUtil.parseClaims(token);
- String account = claims.getSubject();
- Long userId = claims.get("userId", Long.class);
-
- // 避免重复设置
- if (StringUtils.hasText(account) && SecurityContextHolder.getContext().getAuthentication() == null) {
- // 可选:从数据库再查一次,保证用户未被删除/封禁
- User user = userMapper.selectById(userId);
- if (user == null || !StringUtils.hasText(user.getUserRole())) {
- filterChain.doFilter(request, response);
- return;
- }
- List authorities = Collections
- .singletonList(new SimpleGrantedAuthority(user.getUserRole()));
- UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(account,
- null, authorities);
- authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
- SecurityContextHolder.getContext().setAuthentication(authentication);
- }
- } catch (Exception ignored) {
- // 解析失败直接继续,不抛出,保持无状态
- }
- filterChain.doFilter(request, response);
- }
-}
\ No newline at end of file
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/service/UserService.java b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/service/UserService.java
index 1e29a9e..7fdf0d4 100644
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/service/UserService.java
+++ b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/service/UserService.java
@@ -1,23 +1,25 @@
package cn.meowrain.aioj.backend.userservice.service;
import cn.meowrain.aioj.backend.userservice.dao.entity.User;
-import cn.meowrain.aioj.backend.userservice.dto.req.UserLoginRequest;
-import cn.meowrain.aioj.backend.userservice.dto.req.UserRegisterRequest;
-import cn.meowrain.aioj.backend.userservice.dto.resp.UserLoginResponse;
+
+import cn.meowrain.aioj.backend.userservice.dto.req.UserRegisterRequestDTO;
+import cn.meowrain.aioj.backend.userservice.dto.resp.UserAuthRespDTO;
import com.baomidou.mybatisplus.extension.service.IService;
public interface UserService extends IService {
/**
* 用户注册
- * @param request {@link UserRegisterRequest}
+ * @param request {@link cn.meowrain.aioj.backend.userservice.dto.req.UserRegisterRequestDTO}
* @return {@link Long}
*/
- Long userRegister(UserRegisterRequest request);
+ Long userRegister(UserRegisterRequestDTO request);
+
+
/**
- * 用户登录
- * @param request {@link UserLoginRequest}
- * @return {@link UserLoginResponse}
+ * 根据用户账号查找用户认证信息
+ * @param userAccount
+ * @return
*/
- UserLoginResponse userLogin(UserLoginRequest request);
+ UserAuthRespDTO findAuthInfoByUserAccount(String userAccount);
}
diff --git a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/service/impl/UserServiceImpl.java b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/service/impl/UserServiceImpl.java
index a401139..7bc4fab 100644
--- a/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/service/impl/UserServiceImpl.java
+++ b/aioj-backend-user-service/src/main/java/cn/meowrain/aioj/backend/userservice/service/impl/UserServiceImpl.java
@@ -1,46 +1,48 @@
package cn.meowrain.aioj.backend.userservice.service.impl;
-import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.crypto.digest.BCrypt;
import cn.meowrain.aioj.backend.framework.errorcode.ErrorCode;
+import cn.meowrain.aioj.backend.framework.exception.ClientException;
import cn.meowrain.aioj.backend.framework.exception.ServiceException;
import cn.meowrain.aioj.backend.userservice.common.enums.ChainMarkEnums;
import cn.meowrain.aioj.backend.userservice.dao.entity.User;
import cn.meowrain.aioj.backend.userservice.dao.mapper.UserMapper;
-import cn.meowrain.aioj.backend.userservice.dto.chains.context.UserLoginRequestParamVerifyContext;
import cn.meowrain.aioj.backend.userservice.dto.chains.context.UserRegisterRequestParamVerifyContext;
-import cn.meowrain.aioj.backend.userservice.dto.req.UserLoginRequest;
-import cn.meowrain.aioj.backend.userservice.dto.req.UserRegisterRequest;
-import cn.meowrain.aioj.backend.userservice.dto.resp.UserLoginResponse;
+
+import cn.meowrain.aioj.backend.userservice.dto.req.UserRegisterRequestDTO;
+import cn.meowrain.aioj.backend.userservice.dto.resp.UserAuthRespDTO;
import cn.meowrain.aioj.backend.userservice.service.UserService;
-import cn.meowrain.aioj.backend.userservice.utils.JwtUtil;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
import org.springframework.dao.DuplicateKeyException;
-import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.Date;
@Service
@RequiredArgsConstructor
+@Slf4j
public class UserServiceImpl extends ServiceImpl implements UserService {
private final UserRegisterRequestParamVerifyContext userRegisterRequestParamVerifyContext;
- private final UserLoginRequestParamVerifyContext userLoginRequestParamVerifyContext;
- private final PasswordEncoder passwordEncoder;
- private final JwtUtil jwtUtil;
@Override
- public Long userRegister(UserRegisterRequest request) {
+ public Long userRegister(UserRegisterRequestDTO request) {
+ UserAuthRespDTO authInfoByUserAccount = findAuthInfoByUserAccount(request.getUserAccount());
+ if(authInfoByUserAccount!=null){
+ throw new ClientException("重复创建用户");
+ }
+
+ log.info("进行用户注册");
userRegisterRequestParamVerifyContext.handler(ChainMarkEnums.USER_REGISTER_REQ_PARAM_VERIFY.getMarkName(),
request);
// 使用 BCrypt 加密密码
Date now = new Date();
- String encryptPassword = passwordEncoder.encode(request.getUserPassword());
+ String salt = BCrypt.gensalt();
+ String encryptPassword = BCrypt.hashpw(request.getUserPassword(),salt);
User user = new User().setUserAccount(request.getUserAccount()).setUserPassword(encryptPassword)
.setUserRole("user").setCreateTime(now).setUpdateTime(now);
-
-
try {
// 需要修改表,使得用户名是唯一的
this.save(user);
@@ -52,28 +54,15 @@ public class UserServiceImpl extends ServiceImpl implements Us
return user.getId();
}
+
@Override
- public UserLoginResponse userLogin(UserLoginRequest requestParam) {
- // 1.校验
- userLoginRequestParamVerifyContext.handler(ChainMarkEnums.USER_LOGIN_REQ_PARAM_VERIFY.getMarkName(),
- requestParam);
- User user = this.baseMapper.selectOne(Wrappers.lambdaQuery(User.class)
- .eq(User::getUserAccount, requestParam.getUserAccount()));
- if (ObjectUtil.isNull(user)
- || !passwordEncoder.matches(requestParam.getUserPassword(), user.getUserPassword())) {
- throw new ServiceException("用户不存在或者密码错误", ErrorCode.NOT_LOGIN_ERROR);
+ public UserAuthRespDTO findAuthInfoByUserAccount(String userAccount) {
+ User one = this.lambdaQuery().eq(User::getUserAccount, userAccount).one();
+ UserAuthRespDTO userAuthDTO = new UserAuthRespDTO();
+ if(one!=null){
+ BeanUtils.copyProperties(one, userAuthDTO);
+ return userAuthDTO;
}
- // 生成 JWT
- String token = jwtUtil.generateToken(user);
- UserLoginResponse resp = new UserLoginResponse();
- resp.setId(user.getId());
- resp.setUserAccount(user.getUserAccount());
- resp.setUserAvatar(user.getUserAvatar());
- resp.setUserProfile(user.getUserProfile());
- resp.setUserRole(user.getUserRole());
- resp.setCreateTime(user.getCreateTime());
- resp.setUpdateTime(user.getUpdateTime());
- resp.setToken(token);
- return resp;
+ return null;
}
}
diff --git a/aioj-backend-user-service/src/main/resources/application.yml b/aioj-backend-user-service/src/main/resources/application.yml
index d8873e5..2834695 100644
--- a/aioj-backend-user-service/src/main/resources/application.yml
+++ b/aioj-backend-user-service/src/main/resources/application.yml
@@ -5,6 +5,8 @@ spring:
active: @env@
server:
port: 10010
+ servlet:
+ context-path: /api
springdoc:
api-docs:
enabled: true
@@ -26,7 +28,4 @@ knife4j:
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
- mapper-locations: classpath*:/mapper/**/*.xml
-jwt:
- secret: "12345678901234567890123456789012" # 至少32字节!!
- expire: 86400000 # 24小时(单位:毫秒)
\ No newline at end of file
+ mapper-locations: classpath*:/mapper/**/*.xml
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index e4c269e..5e5f211 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,10 +20,10 @@
aioj-backend-gateway
aioj-backend-judge-service
aioj-backend-user-service
- aioj-backend-model
aioj-backend-question-service
aioj-backend-client
aioj-backend-ai-service
+ aioj-backend-auth
17