Подтвердить что ты не робот

Spring Безопасность OAuth2, которая определяет безопасность?

Я пытаюсь внедрить сервер аутентификации OAuth2 с помощью руководств Дейва Сиера с некоторым вдохновением от JHipster. Но я не могу понять, как все это работает.

Похоже, что настройка безопасности, использующая WebSecurityConfigurerAdapter, перезаписывается, когда я использую ResourceServerConfigurerAdapter.

@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 как allowAll().

Это файл авторизацииServerConfigurerAdapter:

@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?

Если кто-нибудь знает какие-либо руководства, учебные пособия, блоги или что-нибудь подобное, что может помочь мне обернуться вокруг того, как это работает, это будет очень полезно.

С уважением, Кеннет.

4b9b3361

Ответ 1

Вам нужна WebSecurityConfigurerAdapter, чтобы защитить конечную точку /authorize и предоставить пользователям возможность пройти аутентификацию. Приложение Spring Boot сделает это для вас (добавив собственный WebSecurityConfigurerAdapter с базовым протоколом HTTP). Он создает цепочку фильтров с порядком = 0 по умолчанию и защищает все ресурсы, если вы не предоставите запрос. @EnableResourceServer делает что-то похожее, но добавленная цепочка фильтров по умолчанию равна порядку = 3, поэтому это резервное копирование для вашего собственного WebSecurityConfigurerAdapter в порядке = 0. Ваша конфигурация выглядит разумно (цепочка входа имеет приоритет, но соответствует только небольшому набору запросов).