2015-02-16 1 views
22

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

Похоже, что настройка безопасности с использованием 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().

Это 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?

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

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

+0

Ваш 'OAuth2ResourceConfig' является избыточным, насколько я могу видеть. Просто говорю. –

+0

Каковы симптомы (какие пути вы нажимаете и что видите)? Использование curl (-v для просмотра заголовков) и ведение журнала DEBUG для Spring Security должно сообщать вам все, что вам нужно знать. –

+0

Симптомы состояли в том, что он в основном игнорировал WebSecurityConfigurerAdapter. Но после прочтения объяснений ниже, я получаю немного больше, как это работает. – LG87

ответ

21

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

+2

Мне нужно было сделать мой WebSecurityConfigurerAdapter order = 2, чтобы заставить его работать. –

+0

Указываете ли вы заказ в аннотации заказа или где вы указываете это? У меня такая же проблема, и аннотирование конфигурации с помощью Order не имеет никакого эффекта, ResourceServerConfigurerAdapter - единственный класс, который используется, и WebSecurityConfigurerAdapter полностью игнорируется. – Cenobyte321

+1

@ Cenobyte321 'реализует Ordered' или' @Order (1) 'или' @Order (2) ' – robinhowlett