修复微信扫码登录签发不一致

This commit is contained in:
zjf committed 2026-06-24 21:14:01 +08:00
1 parent 30bad82955
commit 2c5ef59859
4 files changed
+30 -19

No files matched your search

@@ -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);
@@ -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<String, PjcloudUserDetailsService> userDetailsServiceMap = SpringContextHolder
.getBeansOfType(PjcloudUserDetailsService.class);
Optional<PjcloudUserDetailsService> optional = userDetailsServiceMap.values()
Optional<PjcloudUserDetailsService> 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()
@@ -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;
}
}
@@ -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<String, Object> 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) {