2013-11-21 2 views
12

Так что недавно я перенес настройку Spring из XML в конфигурацию Java. Это сервер Spring OAuth 2, а некоторые конечные точки защищены аутентификацией клиентов, а некоторые конечные точки (confirm_access) защищены аутентификацией пользователя, которая делегируется приложению входа с перенаправлением, сделанным из фильтра («authenticationFilter»). Но я не могу сделать то же самое с Spring Security Java конфигурации:Spring Security Java Config

Вот моя конфигурация безопасности XML рабочий:

<sec:http pattern="/token" create-session="stateless" authentication-manager-ref="clientAuthenticationManager" 
     entry-point-ref="oauthAuthenticationEntryPoint"> 
     <sec:intercept-url pattern="/token" access="IS_AUTHENTICATED_FULLY" /> 
     <sec:anonymous enabled="false" /> 
     <sec:http-basic entry-point-ref="oauthAuthenticationEntryPoint" /> 
     <!-- include this only if you need to authenticate clients via request parameters --> 
     <sec:custom-filter ref="clientCredentialsTokenEndpointFilter" before="BASIC_AUTH_FILTER" /> 
     <sec:access-denied-handler ref="oauthAccessDeniedHandler" /> 
    </sec:http> 

    <sec:http pattern="/css/**" security="none" /> 
    <sec:http pattern="/js/**" security="none" /> 

<sec:http access-denied-page="/errors/access-denied.html" disable-url-rewriting="true" entry-point-ref="authenticationEntryPoint"> 
     <sec:intercept-url pattern="/authorize" access="ROLE_USER" /> 
     <sec:intercept-url pattern="confirm_access" access="ROLE_USER" /> 
     <sec:intercept-url pattern="/device/authorize" access="ROLE_USER" /> 

     <sec:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" /> 

     <sec:custom-filter ref="authenticationFilter" before="ANONYMOUS_FILTER" /> 
     <sec:anonymous /> 
    </sec:http> 

<sec:authentication-manager id="clientAuthenticationManager"> 
     <sec:authentication-provider user-service-ref="clientDetailsUserService" /> 
    </sec:authentication-manager> 

    <sec:authentication-manager alias="authenticationManager"> 
     <sec:authentication-provider ref="authenticationProvider" /> 
    </sec:authentication-manager> 

<sec:global-method-security pre-post-annotations="enabled" proxy-target-class="true"> 
     <sec:expression-handler ref="oauthExpressionHandler" /> 
    </sec:global-method-security> 

    <oauth:expression-handler id="oauthExpressionHandler" /> 

    <oauth:web-expression-handler id="oauthWebExpressionHandler" /> 


Вот мой Java конфигурации попытка:

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled=true) 
@Order(1) 
@Import({WebSecurityConfig.TokenEndpointSecurityConfigurationAdapter.class, 
     WebSecurityConfig.ResourceSecurityConfigurationAdapter.class, 
     WebSecurityConfig.AnonymousSecurityConfigurationAdapter.class}) 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    ClientDetailsUserDetailsService clientDetailsUserService; 

    @Bean(name = "clientAuthenticationManager") 
    @Override 
    public AuthenticationManager authenticationManagerBean() throws Exception { 
     return super.authenticationManagerBean(); 
    } 

    @Override 
    protected void registerAuthentication(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(clientDetailsUserService); 
    } 

    @Configuration 
    @Order(2)               
    public static class TokenEndpointSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter { 

     @Autowired 
     ClientDetailsUserDetailsService clientDetailsUserService; 

     @Autowired 
     OAuth2AuthenticationEntryPoint oauthAuthenticationEntryPoint; 

     @Autowired 
     ClientCredentialsTokenEndpointFilter clientCredentialsTokenEndpointFilter; 

     @Autowired 
     OAuth2AccessDeniedHandler oauthAccessDeniedHandler; 

     @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      http 
       .userDetailsService(clientDetailsUserService) 
       .anonymous().disable() 
       .authorizeUrls() 
       .antMatchers("/token") 
       .fullyAuthenticated() 
      .and() 
       .httpBasic() 
       .authenticationEntryPoint(oauthAuthenticationEntryPoint) 
      .and() 
       .addFilterBefore(clientCredentialsTokenEndpointFilter, BasicAuthenticationFilter.class) 
       .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.stateless) 
      .and() 
       .exceptionHandling().accessDeniedHandler(oauthAccessDeniedHandler); 
     } 

    } 

    @Configuration 
    @Order(3)               
    public static class ResourceSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter{ 

     @Override 
     public void configure(WebSecurity web) throws Exception { 
      web 
       .ignoring() 
        .antMatchers("/css/**","/js/**"); 
     } 
    } 

    @Configuration 
    @Order(4)               
    public static class AnonymousSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter{ 

     @Autowired 
     OAuth2AuthenticationEntryPoint oauthAuthenticationEntryPoint; 

     @Autowired 
     AuthenticationFilter authenticationFilter; 

     @Autowired 
     PreAuthenticatedAuthenticationProvider authenticationProvider; 

     @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      http 
       .authenticationProvider(authenticationProvider) 
       .addFilterBefore(authenticationFilter, AnonymousAuthenticationFilter.class) 
       .authorizeUrls().anyRequest().anonymous() 
      .and() 
       .authorizeUrls() 
       .antMatchers("/authorize","confirm_access","/custom/authorize") 
       .hasRole("USER") 
      .and() 
       .exceptionHandling().accessDeniedPage("/errors/access-denied.html"); 
     } 
    } 
} 

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

+0

Вам нужно два AuthenticationManagers (один для OAuth клиентов и один для пользователей), но я вижу только один в вашей конфигурации на основе Java. –

+0

Здравствуйте @Eugen, это отличный пример, который поможет мне. Но у меня есть некоторые проблемы, когда я использую 'addFilterBefore (clientCredentialsTokenEndpointFilter, BasicAuthenticationFilter.class)' в HttpSecurity, я получаю следующую ошибку компилятора 'he method addFilterBefore (Filter, Class ) из типа HttpSecurity относится к отсутствующему type Filter' как я разрешаю это? –

ответ

9

Поскольку ваша первоначальная конфигурация содержит только два элемента http, ваша новая конфигурация должна содержать только два экземпляра WebSecurityConfigurerAdapter. Каждый экземпляр WebSecurityConfigurerAdapter отображается с использованием http.antMatchers. В настоящее время WebSecurityConfigurerAdapter сопоставляется каждому URL-адресу.

Вы можете обратиться к ссылке на an example о том, как использовать несколько экземпляров WebSecurityConfigurerAdapter (что эквивалентно)

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