我使用Spring Security和OAuth2保护了Spring REST API,我可以成功检索令牌并访问我的API。我的应用程序自己定义OAuth2客户端。
现在我希望用户对某些资源进行匿名访问。用例非常简单:我希望我的应用程序无需登录即可使用 - 但如果他们已登录,我希望能够访问该主体。
到目前为止,这是我的WebSecurityConfigurerAdapter
:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/api1").anonymous().and()
.authorizeRequests().antMatchers("/ap2**").permitAll();
}
一旦我添加第二个antMatcher / anonymous,它就无法工作,但它并没有真正表达我的意图 - 例如我不想匿名访问api1
GET,但在POST上验证(很容易用@PreAuthorize
)。
如何使OAuth2身份验证可选?
我放弃了我的@EnableWebSecurity
,并使用了像这样的ResourceServerConfigurerAdapter
:
@Configuration
@EnableResourceServer
protected static class ResourceServer extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers(HttpMethod.GET, "/api/api1", "/api/api2").permitAll()
.and().authorizeRequests()
.anyRequest().authenticated();
}
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId("my-resource-id");
}
}
现在可以在有或没有认证的情况下调用/api/api1
。