如何在基于 Spring 的反应式应用程序中从身份验证中排除路径?

Posted

技术标签:

【中文标题】如何在基于 Spring 的反应式应用程序中从身份验证中排除路径?【英文标题】:How to exclude a path from authentication in a spring based reactive application? 【发布时间】:2019-02-10 05:03:43 【问题描述】:

在非响应式 Spring 应用程序中,我通常会创建一个配置类,扩展 WebSecurityConfigurerAdapter 并像这样配置 WebSecurity

@Override
public void configure(WebSecurity web) throws Exception 
    web.ignoring().antMatchers("/pathToIgnore");

如何在反应式应用程序中做同样的事情?

【问题讨论】:

您需要返回一个带有所需配置的SecurityWebFilterChain bean。查看baeldung.com/spring-security-5-reactive 在这里查看配置github.com/eugenp/tutorials/blob/master/… 这对你有帮助吗@jimonthebarn? @MadhuBhat 给出的示例仅说明了如何配置安全链的“授权”方面。例如。如果某个资源需要某些特殊角色(例如.pathMatchers("/", "/admin").hasAuthority("ROLE_ADMIN"))或者某个资源不需要额外的权限(.anyExchange().permitAll()),但是这不会影响是否在给定路径上尝试“身份验证”(例如,它将即使在没有特定角色、权限的情况下允许访问的路径上,也尝试对调用者进行身份验证)。 那里需要配置的是http.authorizeExchange().pathMatchers("/pathToIgnore").permitAll().anyExchange().authenticated().and().formLogin().build()。这将确保由 pathMatchers 匹配的路径将在没有身份验证的情况下被允许,并且任何其他路径都将被验证。 【参考方案1】:

在您使用@EnableWebFluxSecurity@EnableReactiveMethodSecurity 注释的安全配置类中,按如下方式注册一个bean:

@Bean
public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) 
    return http.authorizeExchange()
        .pathMatchers("/pathToIgnore")
        .permitAll()
        .anyExchange()
        .authenticated()
        .and()
        .formLogin()
        .and()
        .csrf()
        .disable()
        .build();

在此配置中,pathMatchers("/pathToIgnore").permitAll() 会将其配置为允许从身份验证中排除匹配的路径,anyExchange().authenticated() 会将其配置为对所有其他请求进行身份验证。

【讨论】:

@jimonthebarn 这对您有帮助吗?否则请告诉我。 根本问题是不同的,因此问题应该有不同的措辞。但你的回答对手头的问题是有效的。 @jimonthebarn 的根本问题是什么? 我通过使用自定义ServerSecurityContextRepository 来实现身份验证。它公开了加载和保存SecurityContext 的方法。在加载的情况下,我提取了授权标头,解析包含的令牌并验证其权限。无论路径上实际所需的权限如何,每次请求都会发生这种情况(这是我的假设错误的地方)。如果调用未受保护的端点,我没有发送 auth 标头(这是我的预期行为),这会导致异常并因此导致请求被拒绝。

以上是关于如何在基于 Spring 的反应式应用程序中从身份验证中排除路径?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Boot 中从 Azure SAML 2.0 应用程序获取角色或组

我如何在反应原生 webview 中从网页访问当前位置

如何在 Spring Security 中实现基于 JWT 的身份验证和授权

如何在本机反应中从相机按钮切换到视频录制按钮

如何在反应应用程序中从数据库中获取和显示图像

如何使基本身份验证作为 Angular JS/Spring 启动应用程序中 keycloak 的替代品