web-dev-qa-db-ja.com

セキュリティを決定するSpring Security OAuth2?

JHipsterからインスピレーションを得て、Dave Syerのガイドを使用してOAuth2認証サーバーを実装しようとしています。しかし、私はそれがすべて一緒に機能する方法を理解することはできません。

ResourceServerConfigurerAdapterを使用すると、WebSecurityConfigurerAdapterを使用したセキュリティ設定が上書きされるようです。

@Configuration
@EnableResourceServer
public class OAuth2ResourceConfig extends ResourceServerConfigurerAdapter {

    private TokenExtractor tokenExtractor = new BearerTokenExtractor();

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
                .addFilterAfter(contextClearer(), AbstractPreAuthenticatedProcessingFilter.class)
                .authorizeRequests()
                .anyRequest().authenticated().and().httpBasic();
    }

    private OncePerRequestFilter contextClearer() {
        return new OncePerRequestFilter() {
            @Override
            protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
                if (tokenExtractor.extract(request) == null) {
                    SecurityContextHolder.clearContext();
                }
                filterChain.doFilter(request, response);
            }
        };
    }

@Component
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

    private final AuthenticationManager authenticationManager;

    @Autowired
    public CustomWebSecurityConfigurerAdapter(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
                .parentAuthenticationManager(authenticationManager);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .formLogin()
                    .loginPage("/login").permitAll()
                .and()
                    .authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                .and()
                    .requestMatchers().antMatchers("/login", "/oauth/authorize", "/oauth/confirm_access")
                .and()
                    .authorizeRequests().anyRequest().authenticated();
    }
}

これはいくつかの異なる例から取られたコードであるため、それらはうまく混同されない可能性があります。しかし、OAuth2の優れたドキュメント/サンプルリストを見つけることができません(Spring Bootには素晴らしいドキュメントがあります)。 loginFormをResourceServerConfigurerAdapterに追加しない場合、許可されません。しかし、WebSecurityConfigurererAdapterでpermitAll()として定義しました。

これはAuthorizationServerConfigurerAdapterです:

@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private JwtAccessTokenConverter jwtAccessTokenConverter;

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient("acme")
                .secret("acmesecret")
                .authorizedGrantTypes("authorization_code", "refresh_token",
                        "password").scopes("openid");
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints)  throws Exception {
        endpoints.authenticationManager(authenticationManager).accessTokenConverter(jwtAccessTokenConverter);
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
        oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");
    }
}

私が間違っていることは何ですか? ResourceServerConfigurerAdapter内ですべてのセキュリティを設定する必要がありますか? WebSecurityConfigurerAdapterはもう必要ですか?

これがどのように機能するかについて頭を包むのに役立つガイド、チュートリアル、ブログなどを知っている人がいたら、大歓迎です。

敬具、ケネス。

33
LG87

/ authorizeエンドポイントを保護し、ユーザーが認証する方法を提供するには、WebSecurityConfigurerAdapterが必要です。 Spring Bootアプリケーションは(HTTP基本認証で独自のWebSecurityConfigurerAdapterを追加することで)それを行います。デフォルトでorder = 0のフィルターチェーンを作成し、リクエストマッチャーを提供しない限り、すべてのリソースを保護します。 @EnableResourceServerは同様のことを行いますが、追加するフィルターチェーンはデフォルトでorder = 3にあります。 WebSecurityConfigurerAdapterには@Order(100)注釈があります。したがって、最初にResourceServerがチェック(認証)され、次にWebSecurityConfigureAdapterの拡張のチェックがチェックされます。

設定は正常に見えます(ログインチェーンが優先されますが、少数のリクエストにのみ一致します)。

39
Dave Syer