当前位置: 首页 > 知识库问答 >
问题:

带有匿名访问的Spring Boot安全预认证场景

松德曜
2023-03-14

我需要匿名公开执行器“health”endpoint,这意味着对该endpoint的请求不会通过SiteMinder,因此,HTTP请求头中不会出现SM_USER头。

我面临的问题是,无论我如何尝试配置“health”endpoint,框架都会抛出org.springframework.security.web.authentication.preauth.preauthenticatedCredentialsNotFoundException,因为当请求没有通过SiteMinder时,预期的头(“sm_user”)不存在。

这是我最初的安全配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
                .authorizeRequests().antMatchers("/cars/**", "/dealers/**")
                .hasAnyRole("CLIENT", "ADMIN")
            .and()
                .authorizeRequests().antMatchers("/health")
                .permitAll()
            .and()
                .authorizeRequests().anyRequest().denyAll()
            .and()
                .addFilter(requestHeaderAuthenticationFilter())
                .csrf().disable();
    }

    @Bean
    public Filter requestHeaderAuthenticationFilter() throws Exception {
        RequestHeaderAuthenticationFilter filter = new RequestHeaderAuthenticationFilter();
        filter.setAuthenticationManager(authenticationManager());
        return filter;
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(preAuthProvider());
    }

    @Bean
    public AuthenticationProvider preAuthProvider() {
        PreAuthenticatedAuthenticationProvider authManager = new PreAuthenticatedAuthenticationProvider();
        authManager.setPreAuthenticatedUserDetailsService(preAuthUserDetailsService());
        return authManager;
    }

    @Bean
    public AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken> preAuthUserDetailsService() {
        return new UserDetailsByNameServiceWrapper<>(inMemoryUserDetails());
    }

    @Bean
    public UserDetailsService inMemoryUserDetails() {
        return new InMemoryUserDetailsManager(getUserSource().getUsers());
    }

    @Bean
    public UserHolder getUserHolder() {
        return new UserHolderSpringSecurityImple();
    }

    @Bean
    @ConfigurationProperties
    public UserSource getUserSource() {
        return new UserSource();
    }

我试过的事情:

为匿名访问而不是PermitAll配置健康endpoint:

http
   .authorizeRequests().antMatchers("/health")
   .anonymous()

将WebSecurity配置为忽略健康endpoint:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/health");
}
management.security.enabled=false
.s.DelegatingFilterProxyRegistrationBean : Mapping filter: 'springSecurityFilterChain' to: [/*]
o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'webRequestLoggingFilter' to: [/*]
o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestHeaderAuthenticationFilter' to: [/*]

任何帮助都将不胜感激!谢了!

共有1个答案

鲁炳
2023-03-14

问题在于RequestHeaderAuthenticationFilter既被注册为顶级筛选器(不需要),也被注册在Spring Security FilterChain(需要)中。

“双重注册”的原因是因为Spring Boot将自动向Servlet容器注册任何过滤器bean。

为了防止“自动注册”,我只需定义FilterRegistrationBean,如下所示:

@Bean
public FilterRegistrationBean registration(RequestHeaderAuthenticationFilter filter) {
    FilterRegistrationBean registration = new FilterRegistrationBean(filter);
    registration.setEnabled(false);
    return registration;
}
 类似资料:
  • 我用Spring Security和OAuth2保护了我的Spring REST API,我可以成功地检索令牌并访问我的API。我的应用程序自定义了OAuth2客户端。 当我添加第二个antmatcher/anonymous时,它就无法工作,而且它也没有真正表达我的意图--例如,我不想对GETs进行匿名访问,而是在POSTs上进行身份验证(使用很容易做到)。 如何使OAuth2身份验证可选?

  • BECOMING SECURE AND ANONYMOUS 今天,几乎我们在互联网上做的一切都被跟踪。无论是谷歌跟踪我们的在线搜索、网站访问和电子邮件,还是美国国家安全局(NSA)对我们的所有活动进行编目,无论谁在跟踪我们,我们的每一次在线活动都会被记录、编入索引,然后被挖掘出来,以造福他人。普通个人,尤其是黑客,需要了解如何限制这种跟踪,并在网上保持相对匿名,以限制这种无处不在的监视。 在本章中

  • 我有一个用Keycloak保护的JEE服务(JaxRx),身份验证是有效的,但是当我想用应用安全性时,我得到了。 该服务部署在Wildfly11中,关于文档,我使用和下一个配置文件()将安全上下文传播到EJB层。 我在Wildfly中安装了keycloak。 如图中所示,请求用户是在RequestContext中标识的,但在SessionContext(上下文)不存在的情况下,它显示而不是用户。

  • gRPC 被设计成可以利用插件的形式支持多种授权机制。本文档对多种支持的授权机制提供了一个概览,并且用例子来论述对应API,最后就其扩展性作了讨论。 马上将会推出更多文档和例子。 支持的授权机制 SSL/TLS gRP 集成 SSL/TLS 并对服务端授权所使用的 SSL/TLS 进行了改良,对客户端和服务端交换的所有数据进行了加密。对客户端来讲提供了可选的机制提供凭证来获得共同的授权。 OAut

  • 就像在本主题中一样,我的Spring Security应用程序也有问题。单击“身份验证”按钮时,即使输入了正确的数据,也会在控制台中看到: 访问位于“”的XMLHttpRequesthttp://localhost:8080/api/v1/basicauth“起源”http://localhost:4200'已被CORS策略阻止:对飞行前请求的响应未通过访问控制检查:它没有HTTP ok状态。 而

  • 开发者需要自己维护预签名下发服务器,由预签名下发服务器调用FDS SDK产生预签名链接 由于签名信息在url中,所有http请求请使用https协议 与请求签名认证的区别 对客户端要求低:开发者服务端计算请求签名 更安全:无须把密钥发布到设备上 签名信息保存在url中,而不是在http请求头部 用预签名URL完成分片上传 参考Presigned url分片上传示例 调试相关 参考 预签名链接使用相