web-dev-qa-db-ja.com

Spring SecurityのpermitAll()がOAuth2.0で機能しないのはなぜですか?

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();
}
}
_

Updatethis スレッドで提案されているように、「_/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();
    }

}
_
5
TheCoder

問題が発生しました。問題の原因となったのはコンテキストパスでした。マッピング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構成にコンテキストパスを追加する必要はありません。

2
TheCoder

順序は問題とマッチャー**だと思います。

@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();  

}
0
Jonathan JOhx