如何在基于 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 应用程序获取角色或组