spring-security - 覆盖 /oauth/token 端点的基本身份验证
问题描述
我在覆盖/oauth/token
TokenEndpoint 类中找到的基本身份验证时遇到了一些麻烦。我基本上想添加凭据(client_id
和client_secret
)的自定义验证。
这是授权服务器的配置。
@Configuration
@EnableOAuth2Client
@EnableAuthorizationServer
public class OAuth2Configuration extends AuthorizationServerConfigurerAdapter {
@Autowired
private ClientDetailsService serviceProviderClientDetailsService;
@Autowired
private TokenEnhancer tokenEnhancer;
@Autowired
private TokenStore tokenStore;
@Autowired
private AuthorizationCodeServices authorizationCodeServices;
@Autowired
private OidcWebResponseExceptionTranslator oidcWebResponseExceptionTranslator;
@Autowired
private OidcMnoOAuth2RequestValidator oidcOAuth2RequestValidator;
@Override
public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
clients.withClientDetails(serviceProviderClientDetailsService);
}
@Override
public void configure(final AuthorizationServerEndpointsConfigurer endpoints) {
endpoints.tokenEnhancer(tokenEnhancer);
endpoints.exceptionTranslator(oidcWebResponseExceptionTranslator);
endpoints.authorizationCodeServices(authorizationCodeServices);
endpoints.tokenStore(tokenStore);
endpoints.setClientDetailsService(serviceProviderClientDetailsService);
endpoints.tokenGranter(oidcAuthorizationCodeTokenGranter());
endpoints.requestValidator(oidcOAuth2RequestValidator);
}
@Override
public void configure(final AuthorizationServerSecurityConfigurer oauthServer) {
oauthServer.allowFormAuthenticationForClients();
}
@Bean
public OidcAuthorizationCodeTokenGranter oidcAuthorizationCodeTokenGranter() {
return new OidcAuthorizationCodeTokenGranter();
}
}
提前致谢 !
解决方案
要向客户端或用户凭据添加自定义验证,您可以扩充DaoAuthenticationProvider并分配适当的用户详细信息服务。覆盖其additionalAuthenticationChecks(...)
方法以添加自定义行为。
public class AugmentedDaoAuthenticationProvider extends DaoAuthenticationProvider {
@Override
protected void additionalAuthenticationChecks(final UserDetails userDetails, final UsernamePasswordAuthenticationToken authentication) {
final User user = userDao.findByUsername(userDetails.getUsername())
.orElseThrow(() -> new BadCredentialsException("Incorrect username or password."));
// custom authentication logic
// Perform the actual authentication.
super.additionalAuthenticationChecks(userDetails, authentication);
初始化 bean 并分配适当的用户详细信息服务:如果对用户凭据进行额外的身份验证检查,则分配UserDetailsService,对于客户端凭据,分配ClientDetailsUserDetailsService
<bean id="clientAuthenticationProvider" class="com.test.AugmentedDaoAuthenticationProvider">
<property name="userDetailsService" ref="clientDetailsUserDetailsService"/>
在评论部分解决问题:
ClientDetailsUserDetailsService实现了UserDetailsService并且它有一个将ClientDetailsS ervice作为参数的构造函数。Bean 初始化是这样的:
<bean id="clientDetailsUserDetailsService" class="org.springframework.security.oauth2.provider.client.ClientDetailsUserDetailsService">
<constructor-arg name="clientDetailsService" ref="serviceProviderClientDetailsService"/>
</bean>
然后,您可以将其引用clientDetailsUserDetailsService
到您的自定义DaoAuthenticationProvider
.
推荐阅读
- sql - 在 sql 中将列 2 x 2 转置
- java - 将具有字符串 Seq 的 Spark Dataframe 列转换为具有动态 Json 架构的嵌套 Json
- javascript - Html表格右边框不显示在打印上
- varnish - Varnish 2.x 的“禁止”替代方案
- r - 在R中使用dijkstras算法找到最短路径
- python - 如何根据此处所示的两个变量绘制诱导速度函数的二维图?
- python - 使用 conda activate 时 conda 环境名称更改
- html - 避免在 TCPDF 中的表格行内出现分页符
- google-sheets - 如果数据在多个相邻表之间拆分,如何获取类别的总和
- spring - 有没有办法使用骆驼获取Kafka主题中产生的最后一条消息?