增加品牌方案管理

This commit is contained in:
2026-07-23 18:56:35 +08:00
parent 4c07ec5455
commit b689656faf
67 changed files with 5572 additions and 231 deletions
@@ -67,7 +67,8 @@ public class SecurityConfig {
.pathMatchers("/api/payment/notify").permitAll()
.pathMatchers("/api/payment/refund").permitAll()
.pathMatchers("/api/files/**").permitAll()
.pathMatchers("/api/coach/**").permitAll();
.pathMatchers("/api/coach/**").permitAll()
.pathMatchers("/api/brand").permitAll();
if (isDevOrTest) {
spec.pathMatchers("/swagger-ui.html").permitAll()
@@ -31,10 +31,16 @@ public class JwtTokenProvider {
return Keys.hmacShaKeyFor(jwtProperties.getSecret().getBytes(StandardCharsets.UTF_8));
}
/**
* 默认租户ID,后续多租户化时替换为从用户上下文获取
*/
public static final String DEFAULT_TENANT_ID = "default";
public String generateToken(String username, Long userId) {
Map<String, Object> claims = new HashMap<>();
claims.put("userId", userId);
claims.put("username", username);
claims.put("tenantId", DEFAULT_TENANT_ID);
return Jwts.builder()
.setClaims(claims)
@@ -50,6 +56,7 @@ public class JwtTokenProvider {
claims.put("userId", userId);
claims.put("username", username);
claims.put("roles", roles);
claims.put("tenantId", DEFAULT_TENANT_ID);
return Jwts.builder()
.setClaims(claims)
@@ -76,6 +83,11 @@ public class JwtTokenProvider {
return getClaimsFromToken(token).get("userId", Long.class);
}
public String getTenantIdFromToken(String token) {
String tenantId = getClaimsFromToken(token).get("tenantId", String.class);
return tenantId != null ? tenantId : DEFAULT_TENANT_ID;
}
@SuppressWarnings("unchecked")
public java.util.List<String> getRolesFromToken(String token) {
Object roles = getClaimsFromToken(token).get("roles");
@@ -29,4 +29,32 @@ public class AuthUtil {
if (jwtTokenProvider.getUserIdFromToken(token) <= 0L) throw new IllegalArgumentException("ID无效");
return jwtTokenProvider.getUserIdFromToken(token);
}
/**
* 从 JWT Token 中提取当前用户的租户ID
*/
public String getTenantIdOrThrow(ServerRequest request) {
String tenantId = getTenantId(request);
if (tenantId == null || tenantId.isBlank()) {
throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "无法获取租户ID");
}
return tenantId;
}
/**
* 从 JWT Token 或 Gateway Header 中提取租户ID(不抛异常)
*/
public String getTenantId(ServerRequest request) {
// 优先从 Gateway 转发的 Header 获取
String headerTenantId = request.headers().firstHeader("X-Tenant-Id");
if (headerTenantId != null && !headerTenantId.isBlank()) {
return headerTenantId;
}
// 回退到 JWT Token 中提取
String token = extractToken(request);
if (token != null && jwtTokenProvider.validateToken(token)) {
return jwtTokenProvider.getTenantIdFromToken(token);
}
return JwtTokenProvider.DEFAULT_TENANT_ID;
}
}