如何使用Spring Security OAuth2在Spring Boot中注册自定义BasicAuthenticationFilter AuthenticationProvider

bti*_*nay 10 spring-security basic-authentication spring-boot spring-security-oauth2

上下文

我正在开发一个应用程序,允许经过身份验证的用户创建OAuth2承载令牌,以便与组织发布的API一起使用.这个想法是允许用户自己生成/撤销这样的令牌,类似于GitHub的Personal API令牌.然后,用户可以使用发布的令牌获得对受保护资源的编程访问.在此配置中,OAuth"客户端","授权服务器"和"资源服务器"属于组织.目前,所有这些服务都驻留在同一个流程中.

为此,我正在尝试支持资源所有者密码凭据授予类型.实施环境包括以下内容:

  • 春季启动
  • Spring Security OAuth2

实现的一个约束是无法访问存储的密码.此处理委托给执行实际身份验证的内部Web服务.

问题

由于无法访问存储密码的限制,因此无法使用默认配置,DaoAuthenticationProvider因为它需要访问UserDetails由提供程序返回的对象提供的密码UserDetailsService.

我的猜测是我需要AuthenticationProvider用自定义实现替换它.但是,所有这样做的尝试似乎都没有生效.

以下似乎在parent引用中正确注册AuthenticationManager,但未在运行时委托(由于DaoAuthenticationProvider优先权):

@Configuration
public class SecurityConfig extends GlobalAuthenticationConfigurerAdapter {

  @Override
  public void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.authenticationProvider(new AuthenticationProvider() {

      @Override
      public boolean supports(Class<?> authentication) {
        // For testing this is easier, but should check for UsernamePasswordAuthentication.class
        return true;
      }

      @Override
      public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        // Perform custom logic...
        return authentication;
      }

    });
  }

}
Run Code Online (Sandbox Code Playgroud)

似乎无论我尝试什么(参见下面的参考资料),我总是在其方法中调用ProviderManager时获得以下两个提供者:BasicAuthenticationFilterAuthentication authResult = authenticationManager.authenticate(authRequest)doFilter

[ org.springframework.security.authentication.AnonymousAuthenticationProvider@366815e4, org.springframework.security.authentication.dao.DaoAuthenticationProvider@5da3e311 ]

我认为这可能是一个结果AuthorizationServerSecurityConfigurerclientCredentialsTokenEndpointFilter方法.但是,此类已标记final,因此无法自定义.

任何建议或指示将不胜感激.

资源

我尝试/研究过的事情:

Dav*_*yer 5

如果我理解正确,则需要在密码授予中为用户提供一个自定义身份验证管理器。没有为建筑工地方法:AuthorizationServerEndpointsConfigurer.authenticationManager(AuthenticationManager)。以及使用它的示例:

@Configuration
@EnableAuthorizationServer
protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(authenticationManager);
    }

    ...
Run Code Online (Sandbox Code Playgroud)

(来自https://github.com/spring-projects/spring-security-oauth/blob/master/tests/annotation/vanilla/src/main/java/demo/Application.java#L42)。


归档时间:

查看次数:

10662 次

最近记录:

7 年,6 月 前