diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxLocalResourceServerTokenServices.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxLocalResourceServerTokenServices.java index 1744a6c43..cd69341de 100644 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxLocalResourceServerTokenServices.java +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxLocalResourceServerTokenServices.java @@ -4,14 +4,17 @@ import com.pig4cloud.pigx.common.core.util.SpringContextHolder; import com.pig4cloud.pigx.common.security.exception.UnauthorizedException; import com.pig4cloud.pigx.common.security.service.PigxUser; import com.pig4cloud.pigx.common.security.service.PigxUserDetailsService; +import com.pig4cloud.pigx.common.security.util.PigxSecurityMessageSourceUtil; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Primary; import org.springframework.core.Ordered; +import org.springframework.security.authentication.AccountStatusException; import org.springframework.security.authentication.InternalAuthenticationServiceException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UserDetailsChecker; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.oauth2.common.OAuth2AccessToken; import org.springframework.security.oauth2.common.exceptions.InvalidTokenException; @@ -36,6 +39,8 @@ public class PigxLocalResourceServerTokenServices implements ResourceServerToken private final TokenStore tokenStore; + private final UserDetailsChecker preAuthenticationChecks; + @Override public OAuth2Authentication loadAuthentication(String accessToken) throws AuthenticationException, InvalidTokenException { @@ -68,11 +73,19 @@ public class PigxLocalResourceServerTokenServices implements ResourceServerToken UserDetails userDetails; try { userDetails = optional.get().loadUserByUser(pigUser); + + preAuthenticationChecks.check(userDetails); } catch (UsernameNotFoundException notFoundException) { throw new UnauthorizedException(String.format("%s username not found", pigUser.getUsername()), notFoundException); } + catch (AccountStatusException accountStatusException) { + throw new UnauthorizedException( + PigxSecurityMessageSourceUtil.getAccessor().getMessage( + "AbstractUserDetailsAuthenticationProvider.locked", accountStatusException.getMessage()), + accountStatusException); + } Authentication userAuthentication = new UsernamePasswordAuthenticationToken(userDetails, "N/A", userDetails.getAuthorities()); OAuth2Authentication authentication = new OAuth2Authentication(oAuth2Request, userAuthentication); diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxTokenStoreAutoConfiguration.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxSecurityCommonAutoConfiguration.java similarity index 79% rename from pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxTokenStoreAutoConfiguration.java rename to pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxSecurityCommonAutoConfiguration.java index bcdec8128..d44f78133 100644 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxTokenStoreAutoConfiguration.java +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxSecurityCommonAutoConfiguration.java @@ -7,19 +7,20 @@ import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.security.core.userdetails.UserDetailsChecker; import org.springframework.security.oauth2.provider.OAuth2Authentication; import org.springframework.security.oauth2.provider.token.DefaultAuthenticationKeyGenerator; import org.springframework.security.oauth2.provider.token.TokenStore; /** * @author lengleng - * @date 2020/9/29 + * @date 2022-04-28 *

- * redis token store 自动配置 + * 资源服务器 认证服务器 公用配置 */ @RequiredArgsConstructor @Configuration(proxyBeanMethods = false) -public class PigxTokenStoreAutoConfiguration { +public class PigxSecurityCommonAutoConfiguration { private final KeyStrResolver resolver; @@ -39,4 +40,13 @@ public class PigxTokenStoreAutoConfiguration { return tokenStore; } + /** + * 认证状态检查 + * @return UserDetailsChecker + */ + @Bean + public UserDetailsChecker preAuthenticationChecks() { + return new PigxPreAuthenticationChecks(); + } + } diff --git a/pigx-common/pigx-common-security/src/main/resources/META-INF/spring.factories b/pigx-common/pigx-common-security/src/main/resources/META-INF/spring.factories index 4bc46e709..9d9a8eda7 100644 --- a/pigx-common/pigx-common-security/src/main/resources/META-INF/spring.factories +++ b/pigx-common/pigx-common-security/src/main/resources/META-INF/spring.factories @@ -4,7 +4,7 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.pig4cloud.pigx.common.security.service.PigxDefaultUserDetailsServiceImpl,\ com.pig4cloud.pigx.common.security.service.PigxAppUserDetailsServiceImpl,\ com.pig4cloud.pigx.common.security.service.PigxClientDetailsServiceImpl,\ - com.pig4cloud.pigx.common.security.component.PigxTokenStoreAutoConfiguration,\ + com.pig4cloud.pigx.common.security.component.PigxSecurityCommonAutoConfiguration,\ com.pig4cloud.pigx.common.security.component.PigxSecurityMessageSourceConfiguration,\ com.pig4cloud.pigx.common.security.component.PigxTokenStoreCleanSchedule,\ com.pig4cloud.pigx.common.security.listener.AuthenticationFailureEventListener,\