From c007ae5c8aeefe895a9162063f95343429918f01 Mon Sep 17 00:00:00 2001 From: FalingCliff Date: Sat, 24 May 2025 18:08:24 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin=5Fserver):=20=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E7=99=BB=E5=BD=95=E5=92=8C=20JWT=20?= =?UTF-8?q?=E8=AE=A4=E8=AF=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增管理员登录接口和相关逻辑 - 实现 JWT 生成和验证功能 - 添加 Redis 服务用于黑名单 token - 更新应用配置,增加 JWT 相关设置- 重构部分代码以支持新功能 --- pom.xml | 69 ++++++++++-- .../admin_server/common/RedisService.java | 28 +++++ .../admin_server/config/SwaggerConfig.java | 56 ++++++++++ .../config/WebSecurityConfig.java | 52 +++++++++ .../admin_server/constant/AuthConst.java | 11 ++ .../controller/admin/AdminController.java | 61 +++++++++-- .../controller/admin/AdminMainController.java | 8 +- .../client/ClientMainController.java | 8 +- .../employee/EmployeeMainController.java | 8 +- .../admin_server/enums/ResultCode.java | 1 + .../admin_server/filter/JwtInterceptor.java | 73 +++++++++++++ .../admin_server/model/dto/LoginDto.java | 14 +++ .../example/admin_server/utils/JwtUtil.java | 100 ++++++++++++++++++ src/main/resources/application-dev.yml | 6 ++ src/main/resources/application-prop.yml | 6 ++ src/main/resources/application-test.yml | 6 ++ src/main/resources/application.yml | 6 ++ 17 files changed, 484 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/example/admin_server/common/RedisService.java create mode 100644 src/main/java/com/example/admin_server/config/SwaggerConfig.java create mode 100644 src/main/java/com/example/admin_server/config/WebSecurityConfig.java create mode 100644 src/main/java/com/example/admin_server/constant/AuthConst.java create mode 100644 src/main/java/com/example/admin_server/filter/JwtInterceptor.java create mode 100644 src/main/java/com/example/admin_server/model/dto/LoginDto.java create mode 100644 src/main/java/com/example/admin_server/utils/JwtUtil.java diff --git a/pom.xml b/pom.xml index 59fdacd..d385a47 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.example admin_server @@ -13,58 +13,113 @@ UTF-8 2.6.13 + - - org.springframework.boot - spring-boot-starter-validation - + org.springframework.boot spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + org.springframework.boot + spring-boot-starter-validation + + + com.mysql mysql-connector-j 8.2.0 runtime + + org.springframework.boot spring-boot-configuration-processor true + + org.projectlombok lombok true + + org.springframework.boot spring-boot-starter-test test + + io.springfox springfox-boot-starter 3.0.0 + + com.github.xiaoymin - knife4j-openapi3-spring-boot-starter - 4.4.0 + knife4j-spring-boot-starter + 3.0.3 + + org.springframework.boot spring-boot-devtools runtime + + com.baomidou mybatis-plus-boot-starter 3.5.12 + + + + io.jsonwebtoken + jjwt-api + 0.11.5 + + + io.jsonwebtoken + jjwt-impl + 0.11.5 + runtime + + + io.jsonwebtoken + jjwt-jackson + 0.11.5 + runtime + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.security + spring-security-test + test + + diff --git a/src/main/java/com/example/admin_server/common/RedisService.java b/src/main/java/com/example/admin_server/common/RedisService.java new file mode 100644 index 0000000..79a7912 --- /dev/null +++ b/src/main/java/com/example/admin_server/common/RedisService.java @@ -0,0 +1,28 @@ +package com.example.admin_server.common; + +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.concurrent.TimeUnit; + +@Service +public class RedisService { + + @Resource(name = "stringRedisTemplate") // 指定注入名字为 stringRedisTemplate 的bean + private StringRedisTemplate stringRedisTemplate; + + /** + * 将 token 加入黑名单,并设置过期时间(毫秒) + */ + public void blacklistToken(String token, long expirationMillis) { + stringRedisTemplate.opsForValue().set(token, "blacklisted", expirationMillis, TimeUnit.MILLISECONDS); + } + + /** + * 判断 token 是否在黑名单中 + */ + public boolean isTokenBlacklisted(String token) { + return stringRedisTemplate.hasKey(token); + } +} diff --git a/src/main/java/com/example/admin_server/config/SwaggerConfig.java b/src/main/java/com/example/admin_server/config/SwaggerConfig.java new file mode 100644 index 0000000..36e1138 --- /dev/null +++ b/src/main/java/com/example/admin_server/config/SwaggerConfig.java @@ -0,0 +1,56 @@ +package com.example.admin_server.config; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; + +@Slf4j +@Configuration +public class SwaggerConfig { + + @Bean + public Docket adminApi() { + return new Docket(DocumentationType.OAS_30) + .groupName("管理端") + .select() + .apis(RequestHandlerSelectors.basePackage("com.example.admin_server.controller.admin")) + .paths(PathSelectors.ant("/api/admin/**")) + .build(); + } + + @Bean + public Docket clientApi() { + return new Docket(DocumentationType.OAS_30) + .groupName("客户端") + .select() + .apis(RequestHandlerSelectors.basePackage("com.example.admin_server.controller.client")) + .paths(PathSelectors.ant("/api/client/**")) + .build(); + } + + @Bean + public Docket employeeApi() { + return new Docket(DocumentationType.OAS_30) + .groupName("员工端") + .select() + .apis(RequestHandlerSelectors.basePackage("com.example.admin_server.controller.employee")) + .paths(PathSelectors.ant("/api/employee/**")) + .build(); + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .title("后台管理接口文档") + .description("接口文档说明") + .version("1.0") + .build(); + } +} + + diff --git a/src/main/java/com/example/admin_server/config/WebSecurityConfig.java b/src/main/java/com/example/admin_server/config/WebSecurityConfig.java new file mode 100644 index 0000000..af15728 --- /dev/null +++ b/src/main/java/com/example/admin_server/config/WebSecurityConfig.java @@ -0,0 +1,52 @@ +package com.example.admin_server.config; + +import com.example.admin_server.interceptor.JwtInterceptor; +import com.example.admin_server.utils.JwtUtil; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@EnableWebSecurity +public class WebSecurityConfig implements WebMvcConfigurer { + + private final JwtUtil jwtUtil; + + public WebSecurityConfig(JwtUtil jwtUtil) { + this.jwtUtil = jwtUtil; + } + + // 注册自定义的 JWT 拦截器 + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(new JwtInterceptor(jwtUtil)) + .addPathPatterns("/api/admin/**", "/api/client/**"); // 只拦截需要鉴权的路径 + } + + // Spring Security的过滤器链配置 + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http + // 关闭csrf,因为JWT不需要csrf保护 + .csrf().disable() + // 使用无状态会话,不创建session + .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) + .and() + // 允许匿名访问的接口(登录、注册等) + .authorizeRequests() + .antMatchers("/api/public/**", "/swagger-ui/**", "/v3/api-docs/**", "/swagger-resources/**", "/webjars/**", "/doc.html").permitAll() + .anyRequest().authenticated() + .and() + // 禁用默认登录页 + .formLogin().disable() + // 禁用默认注销功能 + .logout().disable(); + + return http.build(); + } +} diff --git a/src/main/java/com/example/admin_server/constant/AuthConst.java b/src/main/java/com/example/admin_server/constant/AuthConst.java new file mode 100644 index 0000000..3ec6b2c --- /dev/null +++ b/src/main/java/com/example/admin_server/constant/AuthConst.java @@ -0,0 +1,11 @@ +package com.example.admin_server.constant; + +/** + * 权限常量 + */ +public class AuthConst { + // 管理端 + public static final String ADMIN_AUTHORIZATION_HEADER = "adminAuthToken"; + // 客户端 + public static final String FRONT_AUTHORIZATION_HEADER = "assessToken"; +} diff --git a/src/main/java/com/example/admin_server/controller/admin/AdminController.java b/src/main/java/com/example/admin_server/controller/admin/AdminController.java index b6205a2..394d0c9 100644 --- a/src/main/java/com/example/admin_server/controller/admin/AdminController.java +++ b/src/main/java/com/example/admin_server/controller/admin/AdminController.java @@ -1,19 +1,60 @@ package com.example.admin_server.controller.admin; - +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.example.admin_server.common.Result; +import com.example.admin_server.enums.ResultCode; +import com.example.admin_server.mapper.AdminMapper; +import com.example.admin_server.model.dto.LoginDto; +import com.example.admin_server.model.entity.Admin; +import com.example.admin_server.utils.JwtUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.util.DigestUtils; +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; -/** - *

- * 后台管理员表 前端控制器 - *

- * - * @author FallingCliff - * @since 2025-05-24 - */ +import java.util.HashMap; +import java.util.Map; + @RestController -@RequestMapping("/admin") +@RequestMapping("/api/admin") +@RequiredArgsConstructor +@Api(tags = {"管理员接口"}) public class AdminController { + private final AdminMapper adminMapper; + private final JwtUtil jwtUtil; + + @PostMapping("/login") + @ApiOperation(value = "管理员登陆") + public Result login(@RequestBody LoginDto request) { + Admin admin = adminMapper.selectOne(new QueryWrapper() + .eq("username", request.getUsername())); + + if (admin == null) { + return Result.of(ResultCode.UNAUTHORIZED, "用户不存在"); + } + + String inputPassword = DigestUtils.md5DigestAsHex(request.getPassword().getBytes()); + System.out.println(inputPassword); + if (!admin.getPassword().equals(inputPassword)) { + return Result.of(ResultCode.UNAUTHORIZED, "密码错误"); + } + + if (admin.getStatus() == 0) { + return Result.of(ResultCode.FAIL, "账号已禁用"); + } + + Map claims = new HashMap<>(); + claims.put("id", admin.getId()); + claims.put("username", admin.getUsername()); + claims.put("isSuper", admin.getIsSuper()); + + String token = jwtUtil.generateToken(claims); + return Result.ok(token); + } + } diff --git a/src/main/java/com/example/admin_server/controller/admin/AdminMainController.java b/src/main/java/com/example/admin_server/controller/admin/AdminMainController.java index 2fa6f84..cdef859 100644 --- a/src/main/java/com/example/admin_server/controller/admin/AdminMainController.java +++ b/src/main/java/com/example/admin_server/controller/admin/AdminMainController.java @@ -1,8 +1,8 @@ package com.example.admin_server.controller.admin; import com.example.admin_server.config.AppConfig; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -10,14 +10,14 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/admin") -@Tag(name = "AdminMain") +@Api(tags = {"AdminMain"}) @RequiredArgsConstructor public class AdminMainController { private final AppConfig appConfig; @GetMapping("/welcome") - @Operation(summary = "Hello admin") + @ApiOperation(value = "Hello admin") public String welcome() { return "Hello admin" + appConfig.getEnvName(); } diff --git a/src/main/java/com/example/admin_server/controller/client/ClientMainController.java b/src/main/java/com/example/admin_server/controller/client/ClientMainController.java index e9864b1..a6f47c0 100644 --- a/src/main/java/com/example/admin_server/controller/client/ClientMainController.java +++ b/src/main/java/com/example/admin_server/controller/client/ClientMainController.java @@ -1,8 +1,8 @@ package com.example.admin_server.controller.client; import com.example.admin_server.config.AppConfig; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -10,14 +10,14 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/client") -@Tag(name = "ClientMain") +@Api(tags = {"ClientMain"}) @RequiredArgsConstructor public class ClientMainController { private final AppConfig appConfig; @GetMapping("/welcome") - @Operation(summary = "Hello client") + @ApiOperation(value = "Hello client") public String welcome(){ return "Hello client" + appConfig.getEnvName(); } diff --git a/src/main/java/com/example/admin_server/controller/employee/EmployeeMainController.java b/src/main/java/com/example/admin_server/controller/employee/EmployeeMainController.java index 70d9cdd..38aa3ed 100644 --- a/src/main/java/com/example/admin_server/controller/employee/EmployeeMainController.java +++ b/src/main/java/com/example/admin_server/controller/employee/EmployeeMainController.java @@ -1,8 +1,8 @@ package com.example.admin_server.controller.employee; import com.example.admin_server.config.AppConfig; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -10,14 +10,14 @@ import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/employee") -@Tag(name = "EmployeeMain", description = "welcome") +@Api(tags = {"EmployeeMain"}) @RequiredArgsConstructor public class EmployeeMainController { private final AppConfig appConfig; @GetMapping("/welcome") - @Operation(summary = "Hello employee") + @ApiOperation(value = "Hello employee") public String welcome() { return "Hello employee" + appConfig.getEnvName(); } diff --git a/src/main/java/com/example/admin_server/enums/ResultCode.java b/src/main/java/com/example/admin_server/enums/ResultCode.java index ba5997a..ca4a387 100644 --- a/src/main/java/com/example/admin_server/enums/ResultCode.java +++ b/src/main/java/com/example/admin_server/enums/ResultCode.java @@ -9,6 +9,7 @@ public enum ResultCode { SUCCESS(200, "成功"), FAIL(500, "失败"), + NOT_LOGIN(400, "未登录"), UNAUTHORIZED(401, "未授权"), FORBIDDEN(403, "禁止访问"), NOT_FOUND(404, "资源不存在"), diff --git a/src/main/java/com/example/admin_server/filter/JwtInterceptor.java b/src/main/java/com/example/admin_server/filter/JwtInterceptor.java new file mode 100644 index 0000000..f1ea782 --- /dev/null +++ b/src/main/java/com/example/admin_server/filter/JwtInterceptor.java @@ -0,0 +1,73 @@ +package com.example.admin_server.interceptor; + +import com.example.admin_server.common.Result; +import com.example.admin_server.constant.AuthConst; +import com.example.admin_server.enums.ResultCode; +import com.example.admin_server.utils.JwtUtil; +import io.jsonwebtoken.Claims; +import lombok.NonNull; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.nio.charset.StandardCharsets; +import java.util.Optional; + +@Slf4j +public class JwtInterceptor implements HandlerInterceptor { + + private final JwtUtil jwtUtil; + + public JwtInterceptor(JwtUtil jwtUtil) { + this.jwtUtil = jwtUtil; + } + + @Override + public boolean preHandle(@NonNull HttpServletRequest request,@NonNull HttpServletResponse response,@NonNull Object handler) throws Exception { + String requestURI = request.getRequestURI(); + + String token = null; + String clientType = null; + + if (requestURI.startsWith("/api/admin/")) { + // 管理端请求 + token = request.getHeader(AuthConst.ADMIN_AUTHORIZATION_HEADER); + clientType = "admin"; + } else if (requestURI.startsWith("/api/client/")) { + // 客户端请求 + token = request.getHeader(AuthConst.FRONT_AUTHORIZATION_HEADER); + clientType = "front"; + } else { + // 非需鉴权路径,可以放行 + return true; + } + + if (!StringUtils.hasText(token)) { + log.warn("请求[{}]缺少{}令牌", requestURI, clientType); + writeJsonResponse(response, Result.of(ResultCode.NOT_LOGIN)); + return false; + } + + Optional claims = jwtUtil.parseToken(token); + if (!claims.isPresent() || jwtUtil.isTokenExpired(token)) { + log.warn("请求[{}]令牌无效或已过期", requestURI); + writeJsonResponse(response, Result.of(ResultCode.UNAUTHORIZED, "token无效或过期")); + return false; + } + + // 通过校验,将Claims和客户端类型存入请求属性,方便后续使用 + request.setAttribute("claims", claims.get()); + request.setAttribute("clientType", clientType); + + return true; + } + + private void writeJsonResponse(HttpServletResponse response, Object resultObj) throws Exception { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + response.setContentType("application/json;charset=UTF-8"); + String json = com.fasterxml.jackson.databind.json.JsonMapper.builder().build().writeValueAsString(resultObj); + response.getOutputStream().write(json.getBytes(StandardCharsets.UTF_8)); + } +} diff --git a/src/main/java/com/example/admin_server/model/dto/LoginDto.java b/src/main/java/com/example/admin_server/model/dto/LoginDto.java new file mode 100644 index 0000000..46d413d --- /dev/null +++ b/src/main/java/com/example/admin_server/model/dto/LoginDto.java @@ -0,0 +1,14 @@ +package com.example.admin_server.model.dto; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class LoginDto { + @NotBlank + private String username; + + @NotBlank + private String password; +} diff --git a/src/main/java/com/example/admin_server/utils/JwtUtil.java b/src/main/java/com/example/admin_server/utils/JwtUtil.java new file mode 100644 index 0000000..32428f3 --- /dev/null +++ b/src/main/java/com/example/admin_server/utils/JwtUtil.java @@ -0,0 +1,100 @@ +package com.example.admin_server.utils; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.JwtException; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.security.Keys; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.security.Key; +import java.util.Date; +import java.util.Map; +import java.util.Optional; + +@Slf4j +@Component +public class JwtUtil { + + @Value("${app.jwt.secret:mwsK9Ol9Ni2IyTvcdgFDVBxatw8QWx2o}") + private String secret; + + @Value("${app.jwt.expiration:86400000}") // 默认过期时间:1天(毫秒) + private long expire; + + private Key key; + + @PostConstruct + public void init() { + this.key = Keys.hmacShaKeyFor(secret.getBytes()); + } + + /** + * 生成 JWT token + * @param claims 自定义载荷,比如 userId、roles 等 + * @return token 字符串 + */ + public String generateToken(Map claims) { + Date now = new Date(); + Date expiryDate = new Date(now.getTime() + expire); + + return Jwts.builder() + .setClaims(claims) + .setIssuedAt(now) + .setExpiration(expiryDate) + .signWith(key, SignatureAlgorithm.HS256) + .compact(); + } + + /** + * 解析 JWT,返回 Optional + * @param token JWT字符串 + * @return Claims 或空 Optional + */ + public Optional parseToken(String token) { + try { + Claims claims = Jwts.parserBuilder() + .setSigningKey(key) + .build() + .parseClaimsJws(token) + .getBody(); + return Optional.of(claims); + } catch (JwtException | IllegalArgumentException e) { + log.warn("解析JWT失败: {}", e.getMessage()); + return Optional.empty(); + } + } + + /** + * 判断 Token 是否过期 + * @param token JWT字符串 + * @return true 如果过期或者解析失败 + */ + public boolean isTokenExpired(String token) { + return parseToken(token) + .map(claims -> claims.getExpiration().before(new Date())) + .orElse(true); + } + + /** + * 判断 Token 是否有效(非空且未过期) + * @param token JWT字符串 + * @return true 有效 + */ + public boolean isTokenValid(String token) { + return parseToken(token).isPresent() && !isTokenExpired(token); + } + + /** + * 从 Token 中获取 userId (假设保存在 claims 的 "userId" 字段) + * @param token JWT字符串 + * @return Optional 用户ID + */ + public Optional getUserIdFromToken(String token) { + return parseToken(token) + .map(claims -> claims.get("userId", String.class)); + } +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 7cc64d5..58bf9eb 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -3,6 +3,9 @@ server: # application.yml (公用配置) spring: + mvc: + path match: + matching-strategy: ant_path_matcher application: name: my-app jackson: @@ -15,6 +18,9 @@ spring: app: env-name: 'dev' + jwt: + secret: 's9TfkPeAKJOlDw4ox3r6VhAMG7KfI0RK' + expiration: 86400000 springdoc: swagger-ui: diff --git a/src/main/resources/application-prop.yml b/src/main/resources/application-prop.yml index 2f08e6b..7772ee4 100644 --- a/src/main/resources/application-prop.yml +++ b/src/main/resources/application-prop.yml @@ -3,6 +3,9 @@ server: # application.yml (公用配置) spring: + mvc: + path match: + matching-strategy: ant_path_matcher application: name: my-app jackson: @@ -15,6 +18,9 @@ spring: app: env-name: 'prop' + jwt: + secret: '2n9g8b5TfsYLBZGFwE5ImpeQH5u0djEl' + expiration: 86400000 springdoc: swagger-ui: diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index a7719b7..4e6fafa 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -3,6 +3,9 @@ server: # application.yml (公用配置) spring: + mvc: + path match: + matching-strategy: ant_path_matcher application: name: my-app jackson: @@ -15,6 +18,9 @@ spring: app: env-name: 'test' + jwt: + secret: 'ylZS9cQ40nBvcZxJKu9zCIDt096BpZbm' + expiration: 86400000 springdoc: swagger-ui: diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index dabdf5e..07b0308 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -3,6 +3,9 @@ server: # application.yml (公用配置) spring: + mvc: + path match: + matching-strategy: ant_path_matcher application: name: my-app jackson: @@ -18,6 +21,9 @@ spring: app: env-name: 'dev' + jwt: + secret: 'mwsK9Ol9Ni2IyTvcdgFDVBxatw8QWx2o' + expiration: 86400000 springdoc: