0

私は、Springブートバージョン1.5.2.RELEASEを使用してoAuth2認証サーバーを実装しました。許可サーバーは暗黙フローをサポートしています。 WebSecurityConfigの下のログインフォーム(http://localhost:8200/login)はうまくいきます。EnableResourceServerがoAuth2認証サーバーを破棄する

@Configuration 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private JpaUserDetailsService userDetailsService; 

    @Bean 
    @Override 
    public UserDetailsService userDetailsServiceBean() throws Exception { 
    return userDetailsService; 
    } 

    @Bean 
    public PasswordEncoder passwordEncoder() { 
    return new BCryptPasswordEncoder(); 
    } 

    @Bean 
    public AuthenticationProvider authenticationProvider() throws Exception { 
    DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); 
    provider.setUserDetailsService(userDetailsServiceBean()); 
    provider.setPasswordEncoder(passwordEncoder()); 
    return provider; 
    } 

    @Bean 
    @Override 
    public AuthenticationManager authenticationManagerBean() throws Exception { 
    return new ProviderManager(singletonList(authenticationProvider())); 
    } 

    @Override 
    public void configure(WebSecurity web) { 
    web.ignoring() 
      .antMatchers("/") 
      .antMatchers("/docs/**") 
      .antMatchers("/swagger/**") 
      .antMatchers("/token/**") 
      .antMatchers("/v2/*") 
     .antMatchers(HttpMethod.OPTIONS, "/**"); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
    http 
      .authorizeRequests().antMatchers("/login**").permitAll().anyRequest().authenticated().and() 
      .formLogin().loginPage("/login").permitAll().and() 
      .logout().permitAll(); 
    } 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); 
    } 
} 

私はリソースサーバーを同じアプリケーションの一部にします。目的は、ユーザーを管理するためにログインしたユーザーとエンドポイントの詳細を提供するエンドポイント/meが必要です。しかし、私がhttp://localhost:8200/loginを要求すると、「このリソースにアクセスするには完全な認証が必要です」というエラーが表示されるように、EnableResourceServerの下に注釈を付けたResourceServerConfigを追加するとすぐに、

@Configuration 
@EnableResourceServer 
public class ResourceServerConfig extends ResourceServerConfigurerAdapter { 

    public static final String RESOURCE_ID = "proclaim-auth"; 

    @Autowired 
    private ResourceServerTokenServices tokenServices; 

    @Override 
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception { 
    resources 
      .resourceId(RESOURCE_ID) 
      .tokenServices(tokenServices); 
    } 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests().antMatchers("/api/ **").authenticated(); 
    } 
} 

私は、リソースサーバーのセキュリティチェーンが承認サーバーのセキュリティチェーンに先行していると思われます。私は、注釈の順序でWebSecurityConfigに注釈を付けることを試みたが、それは私の問題を解決しませんでした:

@Configuration 
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    ... 
} 

私が間違って何をしているのですか?お知らせ下さい。 ありがとうございます!

EDIT 1 Iは、メソッドResourceServerConfigに設定(HttpSecurity HTTP)およびWebSecurityConfig上-1ために注釈の変更値を追加しました。これで、WebSecurityConfigで定義されたセキュリティが適用され、ResourceServerConfigで定義されたセキュリティは無視されます。だから/私有効なトークンを持つエンドポイントを呼び出すと、私はログインページにリダイレクトされます。

答えて

1

この問題の原因は、ResourceServerConfigクラスのhttpセキュリティの設定が間違っていたためです。次のように正しい構成である。

@Override 
public void configure(HttpSecurity http) throws Exception { 
    http 
      .requestMatchers().antMatchers("/api/**").and() 
      .authorizeRequests().anyRequest().authenticated(); 
} 

requestMatchers「/ API /」で始まるパスにのみ要求がこのセキュリティチェーンによって処理されることを保証します。他のすべての要求は、WebSecurityConfigクラスで定義されているセキュリティーチェーンに渡されます。すべての要求がResourceServerConfigセキュリティチェーンによって処理され、none要求がWebSecurityConfigセキュリティチェーンに到達したので、私の設定でこれが不足していました。

関連する問題