我的安全配置具有3个身份验证提供程序:
DaoAuthenticationProvider
使用UserDetailsService
的简单实现,该实现从数据库中查询用户并返回org.springframework.security.core.userdetails.User
对象。我还在enabled
对象上使用User
布尔标志,该标志由数据库状态决定-是否禁用了is帐户。默认情况下,此提供程序使用UserDetailsChecker的实现,该实现检查用户的布尔标志,并在它们中的任何一个为false时抛出异常。一切正常。
问题
但是,例如,当我使用Oauth2通过Google登录时,默认情况下OAuth2LoginAuthenticationProvider
不会使用UserDetailsChecker来验证这些标志。因此,我已将检查器注入到我的OAuth2UserService
的自定义实现中。
!现在,当引发异常时,ProviderManager首先处理引发的异常并将其存储为lastException
,但紧随THIS CODE之后,因为OAuth2LoginAuthenticationProvider
具有 parent ProviderManager
集(即DaoAuthenticationProvider
),然后代码继续执行并尝试通过Dao提供程序运行Oauth2身份验证并失败,最终将lastException设置为“ OAuth2LoginAuthenticationProvider” ,并且身份验证失败。
问题
如何通过Oauth / Oidc提供程序正确检查从数据库中找到的用户是否被禁用。根据{{1}}代码,这是不可能的,除非我自己实现它并按THIS类似的旧问题中的描述中断循环。
我正在使用最新最好的Spring Boot,Spring Security和Spring Security Oauth2库。