Commit 4d92cbb5 by zhangxingmin

配置

parent 243a95c0
...@@ -118,6 +118,13 @@ ...@@ -118,6 +118,13 @@
<artifactId>yd-user-service</artifactId> <artifactId>yd-user-service</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<!-- yd-user-feign 模块 -->
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-user-feign</artifactId>
<version>${project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>com.yd</groupId> <groupId>com.yd</groupId>
<artifactId>yd-common</artifactId> <artifactId>yd-common</artifactId>
...@@ -128,5 +135,10 @@ ...@@ -128,5 +135,10 @@
<artifactId>yd-framework</artifactId> <artifactId>yd-framework</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.yd</groupId>
<artifactId>yd-feign</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies> </dependencies>
</project> </project>
...@@ -4,6 +4,7 @@ import com.yd.auth.core.security.JwtAuthenticationEntryPoint; ...@@ -4,6 +4,7 @@ import com.yd.auth.core.security.JwtAuthenticationEntryPoint;
import com.yd.auth.core.security.JwtAuthenticationFilter; import com.yd.auth.core.security.JwtAuthenticationFilter;
import com.yd.auth.core.service.impl.AuthUserDetailsService; import com.yd.auth.core.service.impl.AuthUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
...@@ -66,6 +67,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { ...@@ -66,6 +67,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
"/auth/register", "/auth/register",
"/swagger-ui/**", "/swagger-ui/**",
"/v3/api-docs/**", "/v3/api-docs/**",
"/sysUser/body/detail",
"/scrm/test" "/scrm/test"
).permitAll() ).permitAll()
.anyRequest().authenticated() .anyRequest().authenticated()
......
package com.yd.auth.core.security; package com.yd.auth.core.security;
import com.yd.auth.core.dto.AuthUserDto; import com.yd.auth.core.dto.AuthUserDto;
import com.yd.common.result.Result;
import com.yd.user.feign.client.sysuser.ApiSysUserFeignClient;
import com.yd.user.feign.request.sysuser.ApiSysUserDetailBodyRequest;
import com.yd.user.feign.response.sysuser.ApiSysUserDetailResponse;
import com.yd.user.service.model.SysUser; import com.yd.user.service.model.SysUser;
import com.yd.user.service.service.ISysUserService; import com.yd.user.service.service.ISysUserService;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
...@@ -23,9 +27,12 @@ import java.util.Objects; ...@@ -23,9 +27,12 @@ import java.util.Objects;
@Component @Component
public class JwtAuthenticationFilter extends OncePerRequestFilter { public class JwtAuthenticationFilter extends OncePerRequestFilter {
// @Autowired
// @Qualifier("sysUserServiceImpl")
// private ISysUserService iSysUserService;
@Autowired @Autowired
@Qualifier("sysUserServiceImpl") private ApiSysUserFeignClient apiSysUserFeignClient;
private ISysUserService iSysUserService;
private final JwtTokenProvider tokenProvider; private final JwtTokenProvider tokenProvider;
...@@ -72,13 +79,17 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { ...@@ -72,13 +79,17 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
public UserDetails queryUserDetails(String userBizId) { public UserDetails queryUserDetails(String userBizId) {
AuthUserDto authUserDto = null; AuthUserDto authUserDto = null;
SysUser sysUser = iSysUserService.queryOne(userBizId); // 通过Feign调用yd-user-feign服务获取用户信息
if (Objects.isNull(sysUser)) { ApiSysUserDetailBodyRequest request = new ApiSysUserDetailBodyRequest();
request.setUserBizId(userBizId);
Result<ApiSysUserDetailResponse> result = apiSysUserFeignClient.detail(request);
if (Objects.isNull(result.getData())) {
throw new UsernameNotFoundException("用户不存在:"); throw new UsernameNotFoundException("用户不存在:");
} }
ApiSysUserDetailResponse response = result.getData();
authUserDto = new AuthUserDto(); authUserDto = new AuthUserDto();
BeanUtils.copyProperties(sysUser,authUserDto); BeanUtils.copyProperties(response,authUserDto);
authUserDto.setUsername(sysUser.getUserName()); authUserDto.setUsername(response.getUserName());
// 查询用户角色 TODO // 查询用户角色 TODO
// authUserDto.setRoles(roles); // authUserDto.setRoles(roles);
...@@ -86,6 +97,28 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter { ...@@ -86,6 +97,28 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
} }
// /**
// * 查询用户信息返回spring security认证对象UserDetails
// * @param userBizId
// * @return spring security认证对象UserDetails
// */
// public UserDetails queryUserDetails(String userBizId) {
// AuthUserDto authUserDto = null;
//
// SysUser sysUser = iSysUserService.queryOne(userBizId);
// if (Objects.isNull(sysUser)) {
// throw new UsernameNotFoundException("用户不存在:");
// }
// authUserDto = new AuthUserDto();
// BeanUtils.copyProperties(sysUser,authUserDto);
// authUserDto.setUsername(sysUser.getUserName());
// // 查询用户角色 TODO
//// authUserDto.setRoles(roles);
//
// return authUserDto;
//
// }
private String resolveToken(HttpServletRequest request) { private String resolveToken(HttpServletRequest request) {
String bearerToken = request.getHeader("Authorization"); String bearerToken = request.getHeader("Authorization");
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) { if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
......
package com.yd.auth.core.service.impl; package com.yd.auth.core.service.impl;
import com.yd.auth.core.dto.AuthUserDto; import com.yd.auth.core.dto.AuthUserDto;
import com.yd.common.result.Result;
import com.yd.user.feign.client.sysuser.ApiSysUserFeignClient;
import com.yd.user.feign.request.sysuser.ApiSysUserDetailBodyRequest;
import com.yd.user.feign.response.sysuser.ApiSysUserDetailResponse;
import com.yd.user.service.model.SysUser; import com.yd.user.service.model.SysUser;
import com.yd.user.service.service.ISysUserService; import com.yd.user.service.service.ISysUserService;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
...@@ -20,25 +24,49 @@ import java.util.Objects; ...@@ -20,25 +24,49 @@ import java.util.Objects;
@Service @Service
public class AuthUserDetailsService implements UserDetailsService { public class AuthUserDetailsService implements UserDetailsService {
// @Autowired
// @Qualifier("sysUserServiceImpl")
// private ISysUserService iSysUserService;
@Autowired @Autowired
@Qualifier("sysUserServiceImpl") private ApiSysUserFeignClient apiSysUserFeignClient;
private ISysUserService iSysUserService;
@Override @Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//Spring Security用户认证对象 //Spring Security用户认证对象
AuthUserDto authUserDto = null; AuthUserDto authUserDto = null;
// 通过Feign调用yd-user-service服务获取用户信息 // 通过Feign调用yd-user-feign服务获取用户信息
SysUser sysUser = iSysUserService.queryOneByName(username); ApiSysUserDetailBodyRequest request = new ApiSysUserDetailBodyRequest();
if (Objects.isNull(sysUser)) { request.setUserName(username);
Result<ApiSysUserDetailResponse> result = apiSysUserFeignClient.detail(request);
if (Objects.isNull(result.getData())) {
throw new UsernameNotFoundException("用户不存在"); throw new UsernameNotFoundException("用户不存在");
} }
ApiSysUserDetailResponse response = result.getData();
authUserDto = new AuthUserDto(); authUserDto = new AuthUserDto();
BeanUtils.copyProperties(sysUser,authUserDto); BeanUtils.copyProperties(response,authUserDto);
authUserDto.setUsername(sysUser.getUserName()); authUserDto.setUsername(response.getUserName());
// 查询用户角色 TODO // 查询用户角色 TODO
// authUserDto.setRoles(roles); // authUserDto.setRoles(roles);
return authUserDto; return authUserDto;
} }
// @Override
// public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// //Spring Security用户认证对象
// AuthUserDto authUserDto = null;
// // 通过Feign调用yd-user-service服务获取用户信息
// SysUser sysUser = iSysUserService.queryOneByName(username);
// if (Objects.isNull(sysUser)) {
// throw new UsernameNotFoundException("用户不存在");
// }
// authUserDto = new AuthUserDto();
// BeanUtils.copyProperties(sysUser,authUserDto);
// authUserDto.setUsername(sysUser.getUserName());
// // 查询用户角色 TODO
//// authUserDto.setRoles(roles);
//
// return authUserDto;
// }
} }
...@@ -62,6 +62,16 @@ spring: ...@@ -62,6 +62,16 @@ spring:
# nacos的ip地址和端口 # nacos的ip地址和端口
server-addr: ${spring.cloud.nacos.config.server-addr} server-addr: ${spring.cloud.nacos.config.server-addr}
group: YD_GROUP group: YD_GROUP
#feign:
# client:
# config:
# default: # 全局配置(也可指定具体服务名,如 yd-user-api)
# connect-timeout: 5000 # 连接超时(毫秒),默认1000
# read-timeout: 30000 # 读取超时(毫秒),默认60000
# httpclient:
# enabled: true # 启用 Apache HttpClient 替代默认 URLConnection(更稳定)
--- ---
spring: spring:
profiles: prod profiles: prod
......
package com.yd.common.constant;
/**
* 生成编号的常量类
*/
public class CodeGeneratorConstants {
/**
* 预约编号的首字母
*/
public static final String APPOINTMENT = "Y";
}
...@@ -16,6 +16,14 @@ public enum CommonEnum { ...@@ -16,6 +16,14 @@ public enum CommonEnum {
UID_TYPE_INSURANCE_PRODUCT_PLAN("insurance_product_plan","保险产品计划"), UID_TYPE_INSURANCE_PRODUCT_PLAN("insurance_product_plan","保险产品计划"),
UID_TYPE_INSURANCE_ADDITIONAL_PRODUCT("insurance_additional_product","保险附加产品"), UID_TYPE_INSURANCE_ADDITIONAL_PRODUCT("insurance_additional_product","保险附加产品"),
UID_TYPE_OSS_FILE("oss_file","OSS文件元数据"), UID_TYPE_OSS_FILE("oss_file","OSS文件元数据"),
UID_TYPE_APPOINTMENT("appointment","预约信息主表"),
UID_TYPE_PRODUCT_PLAN("product_plan","产品计划信息表"),
UID_TYPE_ADDITIONAL("additional","产品计划-附加险信息表"),
UID_TYPE_POLICYHOLDER("policyholder","投保人信息表"),
UID_TYPE_INSURANT("insurant","受保人信息表"),
UID_TYPE_BENEFICIARY("beneficiary","受益人信息表"),
UID_TYPE_SECOND_HOLDER("second_holder","第二持有人信息表"),
UID_TYPE_APPOINTMENT_FILE("appointment_file","预约附件信息表"),
//作用域枚举 //作用域枚举
SCOPE_SYS("1","系统级(全局)"), SCOPE_SYS("1","系统级(全局)"),
......
package com.yd.common.utils;
import com.yd.common.constant.CodeGeneratorConstants;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;
/**
* 编号生成工具类
*/
public class CodeGenerator {
// 单例模式确保随机数生成器效率
private static final Random random = new Random();
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyMMdd");
/**
* 生成编号
* @param letter 首字母
* @return 格式:首字母 + 6位日期(250903) + 7位随机数字
*/
public static String generateCode(String letter) {
//6位日期
String datePart = LocalDateTime.now().format(DATE_FORMATTER);
//7位随机数字
String randomPart = generateRandomDigits(7);
return letter + datePart + randomPart;
}
/**
* 生成指定长度的随机数字字符串
* @param length 数字字符串长度
* @return 随机数字字符串
*/
private static String generateRandomDigits(int length) {
if (length <= 0) {
throw new IllegalArgumentException("长度必须为正整数");
}
// 生成指定位数的随机数字
int maxValue = (int) Math.pow(10, length);
int randomNumber = random.nextInt(maxValue);
// 格式化为固定长度,前面补零
return String.format("%0" + length + "d", randomNumber);
}
public static void main(String[] args) {
System.out.println(generateCode(CodeGeneratorConstants.APPOINTMENT));
}
}
package com.yd.common.utils; package com.yd.common.utils;
import com.yd.common.enums.CommonEnum; import com.yd.common.enums.CommonEnum;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.Random; import java.util.Random;
/**
* 业务id生成工具类
*/
public class RandomStringGenerator { public class RandomStringGenerator {
// 包含所有数字和字母(大小写)的字符池 // 包含所有数字和字母(大小写)的字符池
private static final String CHAR_POOL = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; private static final String CHAR_POOL = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
......
package com.yd.feign.config; //package com.yd.feign.config;
//
import org.springframework.context.annotation.Bean; //import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; //
import feign.RequestInterceptor; //public class FeignConfig {
import org.springframework.web.context.request.RequestContextHolder; // @Bean
import org.springframework.web.context.request.ServletRequestAttributes; // public FeignTokenInterceptor feignTokenInterceptor() {
// return new FeignTokenInterceptor();
import javax.servlet.http.HttpServletRequest; // }
import java.util.Enumeration; //}
/**
* Feign配置类,传递请求头
*/
@Configuration
public class FeignConfig {
@Bean
public RequestInterceptor requestInterceptor() {
return template -> {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attributes != null) {
HttpServletRequest request = attributes.getRequest();
Enumeration<String> headerNames = request.getHeaderNames();
if (headerNames != null) {
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
String value = request.getHeader(name);
// 传递所有请求头,防止部分丢失
template.header(name, value);
}
}
}
};
}
}
//package com.yd.feign.config;
//
//import feign.RequestInterceptor;
//import feign.RequestTemplate;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//import javax.servlet.http.HttpServletRequest;
//
//@Component
//public class FeignTokenInterceptor implements RequestInterceptor {
// private static final Logger logger = LoggerFactory.getLogger(FeignTokenInterceptor.class);
//
// @Override
// public void apply(RequestTemplate template) {
// ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//
// if (attributes == null) {
// logger.debug("RequestContextHolder没有找到请求属性,跳过Token传递");
// return;
// }
//
// HttpServletRequest request = attributes.getRequest();
// String token = request.getHeader("Authorization");
//
// if (token != null && !token.trim().isEmpty()) {
// template.header("Authorization", token);
// logger.debug("已添加Authorization头到Feign请求");
// } else {
// logger.debug("当前请求中没有Authorization头,跳过Token传递");
// }
// }
//}
...@@ -60,10 +60,6 @@ ...@@ -60,10 +60,6 @@
<artifactId>jjwt-jackson</artifactId> <artifactId>jjwt-jackson</artifactId>
</dependency> </dependency>
<!-- <dependency>-->
<!-- <groupId>com.yd</groupId>-->
<!-- <artifactId>yd-auth-core</artifactId>-->
<!-- </dependency>-->
<dependency> <dependency>
<groupId>com.yd</groupId> <groupId>com.yd</groupId>
<artifactId>yd-common</artifactId> <artifactId>yd-common</artifactId>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment