spring 如何将自定义的身份验证详细信息源添加到承载令牌身份验证过滤器?

hvvq6cgz  于 2022-10-30  发布在  Spring
关注(0)|答案(1)|浏览(241)

BearerTokenAuthenticationFilter使用AuthenticationDetailsSource来构建身份验证请求的详细信息:

authenticationRequest.setDetails(this.authenticationDetailsSource.buildDetails(request));

我隐式地使用了spring-security-config-5.7.2提供的OAuth2 ResourceServerConfigurer,遗憾的是,它没有考虑开发人员定义的AuthenticationDetailsSource:

BearerTokenAuthenticationFilter filter = new BearerTokenAuthenticationFilter(resolver);
        filter.setBearerTokenResolver(bearerTokenResolver);
        filter.setAuthenticationEntryPoint(this.authenticationEntryPoint);
        filter = postProcess(filter);
        http.addFilter(filter);

我确认BearerTokenAuthenticationFilter具有我需要的设置程序:

setAuthenticationDetailsSource()

但是我无法找到一种正确而简单的方法来使用setter(或任何其他方法)为该特定过滤器使用自定义AuthenticationDetailsSource。我正在努力避免创建新的过滤器或新的配置。
我尝试过的方法:
1.去github看看有没有新的版本--不幸的是没有。
1.已尝试自动连接Spring安全筛选器链并直接设置筛选器的AuthenticationDetailsSource,但到目前为止没有成功。
是否有人能够轻松地为承载令牌认证过滤器设置认证详细信息源?
稍后编辑
我已经将这个问题作为Github问题发布给Spring Security团队:https://github.com/spring-projects/spring-security/issues/11655
根据jzheaux@GitHub的说法,正如在接受的答案中指出的,我成功地使用了一个ObjectPostProcessor:

http
.oauth2ResourceServer((oauth2) -> oauth2
    .jwt(withDefaults())
    .withObjectPostProcessor(new ObjectPostProcessor<BearerTokenAuthenticationFilter>() {
        @Override
        public BearerTokenAuthenticationFilter postProcess(BearerTokenAuthenticationFilter object) {
            object.setAuthenticationDetailsSource(myAuthenticationDetailsSource);
            return object;
        }
    });
byqmnocz

byqmnocz1#

要设置您自己的验证详细信息源,请创建ObjectPostProcessor类,在该类中可以使用setAuthenticationDetailsSource:

public class MyObjectPostProcessor implements ObjectPostProcessor<BearerTokenAuthenticationFilter> {
    @Override
    public <O extends BearerTokenAuthenticationFilter> O postProcess(O filter) {
        filter.setAuthenticationDetailsSource(new MyAuthenticationDetailsSource());
        return filter;
    }
}

然后,您可以在创建SecurityFilterChain配置时设置MyObjectPostProcessor:

@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .oauth2ResourceServer()
                .withObjectPostProcessor(new MyObjectPostProcessor());
        return http.build();
    }
}

相关问题