REST OAuth2.0で保護されたAPIを持っています。http:// localhost:8085/auth /を使用してアクセストークンを取得できます。 token?grant_type=password&[email protected]&password=mypass(ユーザー名とともに基本認証を渡す)。
しかし、http:// localhost:8085/api/v1/signupにアクセスしようとすると、APIは_401 unauthorized
_エラー。antMatchers("/signup").permitAll()
を使用しましたが、APIがこのリソースにアクセスするために_access-token
_を期待しているのはなぜですか?このリクエストとともに_access-token
_を渡すと、ユーザーがサインアップされます。
これは私のリソースサーバー構成です
_@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
//require beans and methods here
@Autowired
public void configureGlobal(final AuthenticationManagerBuilder auth) {
auth.authenticationProvider(authProvider());
}
@Override
public void configure(final HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/signup").permitAll()
.anyRequest().authenticated()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
.csrf().disable();
}
}
_
Update: this スレッドで提案されているように、「_/signup
_」を無視しましたが、それも行われませんでした働いた。
_@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
@ComponentScan(basePackages = { "com.sample.rest.security" })
@Order(2)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
//other Beans & methods
@Override
protected void configure(HttpSecurity http) throws Exception {
List<RequestMatcher> requestMatchers = new ArrayList<RequestMatcher>();
requestMatchers.add(new AntPathRequestMatcher("/signup/**"));
http.
requestMatcher(new OrRequestMatcher(requestMatchers)).
authorizeRequests().antMatchers("/signup/**")
.permitAll();
}
}
_
問題が発生しました。問題の原因となったのはコンテキストパスでした。マッピングURL _/api/v1/*
_で定義されたディスパッチャーサーブレットがあり、signup
要求を確認できるように、コンテキストパス、つまり_http://localhost:8085/api/v1/signup
_が含まれています
SpringのOAuth2構成では、コンテキストパスに特別な注意を払う必要があります。まず、AuthorizationServerで定義する必要があります
_@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(final AuthorizationServerEndpointsConfigurer endpoints) {
endpoints
.prefix("/api/v1") //here
.tokenStore(tokenStore())
.accessTokenConverter(accessTokenConverter())
.authenticationManager(authenticationManager)
.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST);
}
_
次に、このようにpermitAll()
パスにコンテキストを追加する必要があります
_@Override
public void configure(final HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/v1/signup").permitAll() //context path here
.anyRequest().authenticated();
}
_
これまでのところ、サインアップ要求はそれとともにアクセストークンを渡すことが期待されています。サインアップからOAuthセキュリティを削除するには、WebSecurity
でセキュリティを削除する必要があります。これはWebSecurityConfigurerAdapter
を使用して実行できます
_@EnableWebSecurity
@EnableGlobalMethodSecurity
@ComponentScan(basePackages = { "com.sample.rest.security" })
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity webSecurity) throws Exception {
webSecurity.ignoring().antMatchers("/signup");
}
//////////// OR use below method ///////////
/* @Override
protected void configure(HttpSecurity http) throws Exception {
http.
authorizeRequests().antMatchers("/signup/**").permitAll();
}
*/
}
_
WebSecurityConfigurerAdapter
構成にコンテキストパスを追加する必要はありません。
順序は問題とマッチャー**だと思います。
@Override
public void configure(final HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/signup**")
.permitAll()
.and()
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() .csrf().disable();
}