如何通过我的基本身份验证配置允许“/api/**”进入我在 Spring Security 中的 oauth 配置
Posted
技术标签:
【中文标题】如何通过我的基本身份验证配置允许“/api/**”进入我在 Spring Security 中的 oauth 配置【英文标题】:How to allow "/api/**" through my basic auth config and into my oauth config in Spring Security 【发布时间】:2017-06-26 13:57:56 【问题描述】:我有一个同时使用 Basic Auth 和 OAuth2 的应用。
一些 URL 使用 Basic Auth 授权,而“/api/**”使用 OAuth2 授权。
目前,我有两个 Java 配置文件(WebSecurityConfigurerAdapter
和 ResourceServerConfigurerAdapter
)
每个配置文件都定义了一个public void configure(HttpSecurity http)
方法。
我遇到的问题是我需要一种优雅的方式来告诉我的应用在给定 url 请求的情况下是使用基本身份验证还是 oauth2。
目前我正在使用requestMatchers
来实现这一点:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
@Override
protected void configure(HttpSecurity http) throws Exception
http
.csrf().disable()
.requestMatchers()
.antMatchers("/*", "/login/**", "/reviews/**")
.and()
.authorizeRequests()
.antMatchers("/*").permitAll()
.antMatchers("/js/**").permitAll()
.antMatchers("/img/**").permitAll()
.formLogin()
.loginPage("/login")
.successHandler(loginSuccessPostHandler)
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/").permitAll()
.and()
.apply(getSpringSocialConfigurer());
@Configuration
public class OAuth2ServerConfig
@Configuration
@EnableResourceServer
protected static class Oauth2ServerConfig extends ResourceServerConfigurerAdapter
@Override
public void configure(HttpSecurity http) throws Exception
http.httpBasic().disable();
http.csrf().disable();
http.requestMatchers()
.antMatchers("/api/**")
.and()
.authorizeRequests()
.antMatchers("/api/v1/**").access("#oauth2.hasScope('read')");
问题是,每次我添加一个不是“/api/**”的新 URL 时,我都需要将它添加到我的 WebSecurityConfig
的 requestMatcher 部分......这可能会导致愚蠢的错误未来。
有没有一种方法可以基于负前瞻正则表达式进行 requestMatcher 搜索?我使用正则表达式进行了尝试:^(?!/api)
,但由于它实际上并没有返回 MATCH,而只返回“find == true”,所以它似乎没有完成工作。
有什么想法/建议吗?
【问题讨论】:
【参考方案1】:你可以使用NegatedRequestMatcher:
一个RequestMatcher,它将否定传入的RequestMatcher。例如,如果传入的RequestMatcher返回true,则NegatedRequestMatcher将返回false。如果传入的RequestMatcher返回false,NegatedRequestMatcher会返回true。
【讨论】:
【参考方案2】:您应该在@Configuration
类上使用Order(...)
注释。首先配置您的 OAuth2ServerConfig
并仅提供 http.requestMatchers().antMatchers("/api/**")
并让您的 WebSecurityConfig
第二 (@Order(2)
) 没有 http.requestMatchers()
以提供所有其余 URL!
查看https://***.com/a/44871933/173149的详细信息
【讨论】:
以上是关于如何通过我的基本身份验证配置允许“/api/**”进入我在 Spring Security 中的 oauth 配置的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 YAML、tavern 和 pytest 使用基本身份验证测试 API
使用 OAuth 保护我的 REST API,同时仍然允许通过第三方 OAuth 提供程序进行身份验证(使用 DotNetOpenAuth)