我对Spring很新,我尝试使用spring-security-oauth2构建OAuth服务器。
我主要参考spring.io给出的示例和教程。
https://github.com/spring-projects/spring-security-oauth/tree/master/samples/oauth2 http://spring.io/guides/tutorials/spring-boot-oauth2/
但是,我遇到了HttpSecurity
配置的一些问题。
我的文件夹结构如下。
├─java
│ └─com
│ └─example
│ Greeting.java
│ GreetingController.java
│ MvcConfig.java
│ OAuth2ServerConfig.java
│ SecurityConfig.java
│ SocialApplication.java
│
└─resources
│ application.yml
│
└─templates
hello.html
home.html
login.html
我在HttpSecurity
SecurityConfig.java
配置
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/", "/home").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll()
.and()
.logout()
.permitAll();
}
}
好的,它运作正常。但是,我想在我的greeting
中保护Resource Server
api(这是我刚刚从另一个演示中复制的简单的api api)。
所以我在HttpSecurity
OAuth2ServerConfig.java
配置
@Configuration
@EnableResourceServer
protected static class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId(RESOURCE_ID);
}
@Override
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.requestMatchers().antMatchers("/greeting")
.and()
.authorizeRequests()
.anyRequest().access("#oauth2.hasScope('scope1')");
// @formatter:on
}
}
似乎我只保护/greeting
。但是,完成此操作后,我甚至无法访问/
和/login
。它说Full authentication is required to access this resource
。
我是否错过了一些配置或做错了什么?
答案 0 :(得分:3)
好吧,我找到了解决方案。 这种情况在issue中提到。 这是Spring-Security 4.0.3中的一个错误。
解决问题的方法是在配置requestMatcher()
时使用requestMatchers()
而不是Resource Server
。
这是一个例子。
@Override
public void configure(HttpSecurity http) throws Exception {
http
.requestMatcher(
new OrRequestMatcher(
new AntPathRequestMatcher("/greeting"),
new AntPathRequestMatcher("/greeting2")
)
)
.authorizeRequests()
.antMatchers("/greeting").access("#oauth2.hasScope('scope1')")
.antMatchers("/greeting2").access("#oauth2.hasScope('scope2')");
}
答案 1 :(得分:1)
我之前遇到过同样的问题。
要解决此问题,我将requestMatchers().antMatchers(...).and()
替换为antMatcher(...)
请尝试以下配置:
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.antMatcher("/greeting")
.authorizeRequests()
.anyRequest().access("#oauth2.hasScope('scope1')");
// @formatter:on
}
答案 2 :(得分:0)
由于anyRequest().access("#oauth2.hasScope('scope1')");
在您的ResourceServerConfiguration
中,每个请求都需要通过OAuth范围进行身份验证,包括/
和/login
(因为OAuth安全配置位于Spring安全链中的正常配置)。如果您想使用OAuth保护/greeting
,您应该在ResourceServerConfiguration
:{/ p>
@Override
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.authorizeRequests()
.antMatchers("/greeting").authenticated();
// @formatter:on
}
答案 3 :(得分:0)
我遇到了同样的问题,接受的答案确实解决了这个问题。但是,当前的解决方案应该是使用spring-security-oauth2
版本2.0.9.RELEASE
。此版本包括a fix,它应该在Spring Security 3.2和4.0中都有效。