2016-09-13 2 views
5

У меня есть приложение Spring - нет приложение Spring Boot - что я пытаюсь объявить раздел API как OAuth2, защищенный с помощью Spring Security. Моя конфигурация авторизации и общего доступа к ресурсам отлично работает, когда я определяю элементы http в XML, но когда я пытаюсь реализовать блоки доступа к ресурсам с использованием ResourceServerConfigureAdapter#configure(HttpSecurity) - в комплекте с @EnableResourceServer и т. Д., Метод configure никогда не срабатывает (тесты конца теста также не работают). Пример Java config ниже:Spring Security OAuth Java Config

 @Override 
     public void configure(ResourceServerSecurityConfigurer resources) throws Exception { 
      resources.resourceId("oauth2/control"); 
     } 

     @Override 
     public void configure(HttpSecurity http) throws Exception { 
      http.antMatcher("/api/**") 
       .authorizeRequests().anyRequest().hasRole("OAUTH_USER").and() 
       .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() 
       // before=PRE_AUTH_FILTER 
       .addFilterBefore(oAuth2AuthenticationProcessingFilter, AbstractPreAuthenticatedProcessingFilter.class) 
       .csrf().disable() 
       .anonymous().disable() 
       .exceptionHandling() 
       .accessDeniedHandler(oAuth2AccessDeniedHandler) 
       .authenticationEntryPoint(loginUrlAuthenticationEntryPoint); 
     } 

Я попытался объявить несколько разных способов настройки конфигурации, но не кубик. А именно, я пробовал как верхний уровень @Configuration классы, распространяющиеся ResourceServerConfigurerAdapter, так и методы бобов, возвращающиеся ResourceServerConfiguration, как в Dave Syer's example; Я также попытался явно установить порядок на Ordered.HIGHEST_PRECEDENCE на соответствующие компоненты.

Возможно, важно отметить, что большая часть устаревшей конфигурации безопасности приложения определяется с помощью XML-элементов, подобных приведенным выше. Другой возможный красный флаг о моей конфигурации - чтобы получить конечную точку маркера для аутентификации против базового auth client_id: client_secret мне пришлось подключить свой собственный BasicAuthFilter(ProviderManager(DaoAuthProvider(ClientUserDetailsService(clientDetailsService))))), когда, поскольку это ванильный и «правильный» способ аутентификации конечной точки маркера, d ожидать, что Spring config будет просто по умолчанию.

В любом случае, я ни в коем случае не могу получить ResourceServerConfigureAdapter#configure(HttpSecurity). Мой Going теория:

  • Коего-что о предыдущих блоках XML HTTP препятствует моему configure метода из когда-либо даже называют

  • Это просто только Spring Загрузочной особенности - хотя я видел ни один язык к тому эффекту

  • Там нет прямо какой-то объект в контексте приложения, что я пропускаю (опять же, оперативные аннотаций, что у меня есть на работе - кроме очевидного @Configuration и @Bean - являются @EnableWebSecurity, @EnableAuthenticationServer и @EnableResourceServer).

  • Я совершил некоторую ошибку конфигурации (duh).

Любые примеры были бы оценены

Пример OAuth2 класс конфигурации (один из нескольких различных итераций) ниже:

@Configuration 
@EnableWebSecurity 
@EnableResourceServer 
public class OAuth2Configuration { 
    ... etc ... 

    @Bean 
    public ResourceServerConfiguration adminResources() { 
     // copped from https://github.com/spring-projects/spring-security-oauth/tree/master/tests/annotation/multi 
     ResourceServerConfiguration resource = new ResourceServerConfiguration() { 
      public void setConfigurers(List<ResourceServerConfigurer> configurers) { 
       super.setConfigurers(configurers); 
      } 
     }; 

     resource.setConfigurers(Collections.singletonList(new ResourceServerConfigurerAdapter() { 

      @Override 
      public void configure(ResourceServerSecurityConfigurer resources) throws Exception { 
       resources.resourceId("oauth2/control"); 
      } 

      @Override 
      public void configure(HttpSecurity http) throws Exception { 
       http.antMatcher("/api/**") 
        .authorizeRequests().anyRequest().hasRole("OAUTH_USER").and() 
        .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and() 
        // before=PRE_AUTH_FILTER 
        .addFilterBefore(oAuth2AuthenticationProcessingFilter, AbstractPreAuthenticatedProcessingFilter.class) 
        .csrf().disable() 
        .anonymous().disable() 
        .exceptionHandling() 
        .accessDeniedHandler(oAuth2AccessDeniedHandler) 
        .authenticationEntryPoint(loginUrlAuthenticationEntryPoint); 
      } 

     })); 
     resource.setOrder(Ordered.HIGHEST_PRECEDENCE); 

     return resource; 
    } 

    @Configuration 
    @EnableAuthorizationServer 
    public static class OAuth2AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { 
     ... etc ... 
    } 
} 

Analogogous <http> конфигурации, что является подобрал:

<sec:http pattern="/api/**" create-session="stateless" 
      entry-point-ref="loginUrlAuthenticationEntryPoint"> 
    <sec:anonymous enabled="false" /> 
    <sec:csrf disabled="true"/> <!-- csrf tokens don't make sense for a 3rd party API --> 
    <sec:custom-filter ref="oauth2ProcessingFilter" before="PRE_AUTH_FILTER"/> 
    <sec:access-denied-handler ref="oauthAccessDeniedHandler" /> 
    <sec:intercept-url pattern="/api/**" access="hasRole('OAUTH_USER')" /> 
</sec:http> 

ответ

1

Если вы одновременно используете как конфигурацию безопасности на основе Java, так и XML, будет собрано только XML-based. Пробовали ли вы отключить/комментировать все ваши настройки безопасности на основе XML и посмотреть, активирует ли ваша Java-система?

У меня была аналогичная проблема раньше. Я попросил помощи на канале Spring Security Gitter, а также провел некоторое расследование.Смотрите ниже:

enter image description here

+0

Если угадали. Спасибо @Sofia! – jwilner

Смежные вопросы