From 2c5ef59859a76882d67df09e0c74dd99db33bd28 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Wed, 24 Jun 2026 21:14:01 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BE=AE=E4=BF=A1=E6=89=AB?= =?UTF-8?q?=E7=A0=81=E7=99=BB=E5=BD=95=E7=AD=BE=E5=8F=91=E4=B8=8D=E4=B8=80?= =?UTF-8?q?=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/endpoint/PjcloudTokenEndpoint.java | 13 ++++++++----- .../PjcloudCustomOpaqueTokenIntrospector.java | 17 ++++++----------- .../admin/handler/WxPcTicketLoginHandler.java | 9 ++++++++- .../service/impl/PcWechatSocialServiceImpl.java | 10 ++++++++-- 4 files changed, 30 insertions(+), 19 deletions(-) diff --git a/pjcloud-auth/src/main/java/com/bsd/pjcloud/auth/endpoint/PjcloudTokenEndpoint.java b/pjcloud-auth/src/main/java/com/bsd/pjcloud/auth/endpoint/PjcloudTokenEndpoint.java index 73ce9bf3..fbb9caff 100644 --- a/pjcloud-auth/src/main/java/com/bsd/pjcloud/auth/endpoint/PjcloudTokenEndpoint.java +++ b/pjcloud-auth/src/main/java/com/bsd/pjcloud/auth/endpoint/PjcloudTokenEndpoint.java @@ -31,6 +31,7 @@ import com.bsd.pjcloud.admin.api.vo.TokenVO; import com.bsd.pjcloud.common.core.constant.CacheConstants; import com.bsd.pjcloud.common.core.constant.CommonConstants; import com.bsd.pjcloud.common.core.constant.SecurityConstants; +import com.bsd.pjcloud.common.core.constant.enums.UserTypeEnum; import com.bsd.pjcloud.common.core.util.KeyStrResolver; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.core.util.RetOps; @@ -115,11 +116,13 @@ public class PjcloudTokenEndpoint { .build(); SysUser sysUser = userTokenDTO.getSysUser(); - // 构建用户信息 , 这里只拼接了 UserTokenDTO 中的 username 和 authorities ,其他字段写死,可以自行场地; - PjcloudUser pigUser = new PjcloudUser(sysUser.getUserId(),sysUser.getUsername(),sysUser.getDeptId(),sysUser.getPhone() - ,sysUser.getAvatar(),sysUser.getNickname(),sysUser.getName(), sysUser.getEmail(), sysUser.getTenantId() - , sysUser.getPassword(), true, true,"1", true,false, userTokenDTO.getAuthorities() - .stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList())); + PjcloudUser pigUser = new PjcloudUser(sysUser.getUserId(), sysUser.getUsername(), sysUser.getDeptId(), sysUser.getPhone(), + sysUser.getAvatar(), sysUser.getNickname(), sysUser.getName(), sysUser.getEmail(), sysUser.getTenantId(), + sysUser.getPassword(), true, true, UserTypeEnum.TOB.getStatus(), + !CommonConstants.STATUS_LOCK.equals(sysUser.getPasswordExpireFlag()), + !CommonConstants.STATUS_LOCK.equals(sysUser.getLockFlag()), + userTokenDTO.getAuthorities() + .stream().map(SimpleGrantedAuthority::new).collect(Collectors.toList())); Authentication usernamePasswordAuthentication = new UsernamePasswordAuthenticationToken(pigUser, StrUtil.EMPTY); diff --git a/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/component/PjcloudCustomOpaqueTokenIntrospector.java b/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/component/PjcloudCustomOpaqueTokenIntrospector.java index c02ada6a..57eb4d3b 100644 --- a/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/component/PjcloudCustomOpaqueTokenIntrospector.java +++ b/pjcloud-common/pjcloud-common-security/src/main/java/com/bsd/pjcloud/common/security/component/PjcloudCustomOpaqueTokenIntrospector.java @@ -41,21 +41,16 @@ public class PjcloudCustomOpaqueTokenIntrospector implements OpaqueTokenIntrospe if (Objects.isNull(oldAuthorization)) { throw new InvalidBearerTokenException(token); } - if (SecurityConstants.FROM.equals(oldAuthorization.getRegisteredClientId())){ - return (PjcloudUser) ((UsernamePasswordAuthenticationToken) Objects.requireNonNull(oldAuthorization).getAttributes().get(Principal.class.getName())).getPrincipal(); - } - // 客户端模式默认返回 if (AuthorizationGrantType.CLIENT_CREDENTIALS.equals(oldAuthorization.getAuthorizationGrantType())) { return new PjcloudClientCredentialsOAuth2AuthenticatedPrincipal( Objects.requireNonNull(oldAuthorization.getAccessToken().getClaims()), AuthorityUtils.NO_AUTHORITIES, oldAuthorization.getPrincipalName()); } - Map userDetailsServiceMap = SpringContextHolder - .getBeansOfType(PjcloudUserDetailsService.class); - - Optional optional = userDetailsServiceMap.values() + Optional optional = SpringContextHolder + .getBeansOfType(PjcloudUserDetailsService.class) + .values() .stream() .filter(service -> service.support(Objects.requireNonNull(oldAuthorization).getRegisteredClientId(), oldAuthorization.getAuthorizationGrantType().getValue())) @@ -65,8 +60,9 @@ public class PjcloudCustomOpaqueTokenIntrospector implements OpaqueTokenIntrospe try { Object principal = Objects.requireNonNull(oldAuthorization).getAttributes().get(Principal.class.getName()); UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = (UsernamePasswordAuthenticationToken) principal; - Object tokenPrincipal = usernamePasswordAuthenticationToken.getPrincipal(); - userDetails = optional.get().loadUserByUser((PjcloudUser) tokenPrincipal); + PjcloudUser tokenPrincipal = (PjcloudUser) usernamePasswordAuthenticationToken.getPrincipal(); + // 统一从 DB/缓存重载用户(含 ROLE_*、deptId),数据权限与密码登录一致 + userDetails = optional.orElseThrow().loadUserByUser(tokenPrincipal); } catch (UsernameNotFoundException notFoundException) { log.warn("用户不不存在 {}", notFoundException.getLocalizedMessage()); @@ -76,7 +72,6 @@ public class PjcloudCustomOpaqueTokenIntrospector implements OpaqueTokenIntrospe log.error("资源服务器 introspect Token error {}", ex.getLocalizedMessage()); } - // 注入客户端信息,方便上下文中获取 PjcloudUser pjcloudUser = (PjcloudUser) userDetails; Objects.requireNonNull(pjcloudUser) .getAttributes() diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/handler/WxPcTicketLoginHandler.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/handler/WxPcTicketLoginHandler.java index 992b3188..80824564 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/handler/WxPcTicketLoginHandler.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/handler/WxPcTicketLoginHandler.java @@ -9,6 +9,7 @@ import com.bsd.pjcloud.common.core.constant.CacheConstants; import com.bsd.pjcloud.common.core.exception.CheckedException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.CacheManager; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; @@ -24,6 +25,8 @@ public class WxPcTicketLoginHandler implements LoginHandler { private final SysUserService sysUserService; + private final CacheManager cacheManager; + private String ticketKey(String ticket) { return CacheConstants.WX_PC_SOCIAL_TICKET + ticket; } @@ -56,7 +59,11 @@ public class WxPcTicketLoginHandler implements LoginHandler { @Override public UserInfo handle(String loginStr) { String openid = identify(loginStr); - return info(openid); + UserInfo userInfo = info(openid); + if (userInfo != null && userInfo.getSysUser() != null) { + cacheManager.getCache(CacheConstants.USER_DETAILS).evict(userInfo.getSysUser().getUsername()); + } + return userInfo; } } diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/PcWechatSocialServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/PcWechatSocialServiceImpl.java index 2045b540..151d604f 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/PcWechatSocialServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/PcWechatSocialServiceImpl.java @@ -117,6 +117,7 @@ public class PcWechatSocialServiceImpl implements PcWechatSocialService { throw new CheckedException("微信账号与绑定不一致,请使用已绑定的微信扫码"); } redisTemplate.delete(loginConfirmKey(confirmTicket)); + cacheManager.getCache(CacheConstants.USER_DETAILS).evict(user.getUsername()); return issueToken(user); } @@ -139,10 +140,15 @@ public class PcWechatSocialServiceImpl implements PcWechatSocialService { } private Map issueToken(SysUser user) { - UserInfo userInfo = sysUserService.findUserInfo(user); + SysUser freshUser = sysUserService.getById(user.getUserId()); + if (freshUser == null) { + throw new CheckedException("用户不存在"); + } + cacheManager.getCache(CacheConstants.USER_DETAILS).evict(freshUser.getUsername()); + UserInfo userInfo = sysUserService.findUserInfo(freshUser); UserTokenDTO userTokenDTO = new UserTokenDTO(); userTokenDTO.setSysUser(userInfo.getSysUser()); - userTokenDTO.setUsername(user.getUsername()); + userTokenDTO.setUsername(freshUser.getUsername()); userTokenDTO.setAuthorities(buildTokenAuthorities(userInfo)); R tokenResult = remoteTokenService.generateToken(userTokenDTO); if (tokenResult == null || tokenResult.getCode() != 0 || tokenResult.getData() == null) {