修复微信扫码登录签发不一致
This commit is contained in:
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);
|
||||
|
||||
|
||||
+6
-11
@@ -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()
|
||||
|
||||
+8
-1
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+8
-2
@@ -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) {
|
||||
|
||||
Reference in new issue
Block a user