2013-11-21 30 views
12

Gần đây tôi đã di chuyển cấu hình Spring từ cấu hình XML sang Java. Máy chủ Spring OAuth 2 và một số thiết bị đầu cuối được bảo mật bằng xác thực máy khách và một số điểm cuối (confirm_access) được bảo mật bằng xác thực người dùng, được ủy quyền để đăng nhập ứng dụng bằng chuyển hướng được thực hiện từ bộ lọc ("authenticationFilter"). Nhưng tôi không thể làm tương tự với Xuân An Java cấu hình:Cấu hình Java bảo mật mùa xuân

Đây cấu hình bảo mật XML làm việc của tôi:

<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" /> 


Đây là nỗ lực Java cấu hình của tôi:

@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"); 
     } 
    } 
} 

Với cấu hình này, Spring Security cố gắng xác thực người dùng cho tất cả các điểm cuối và hiển thị tạo biểu mẫu đăng nhập, do đó, bộ lọc tùy chỉnh không được thêm vào.
Sai lầm của tôi ở đâu?

+0

Bạn cần hai AuthenticationManagers (một cho khách hàng OAuth và một cho người dùng), nhưng tôi có thể nhìn thấy chỉ là một trong cấu hình dựa trên java của bạn. –

+0

Xin chào @Eugen, đây là ví dụ tuyệt vời, hãy giúp tôi. Nhưng tôi có một số vấn đề, khi tôi sử dụng 'addFilterBefore (clientCredentialsTokenEndpointFilter, BasicAuthenticationFilter.class)' trong HttpSecurity, tôi nhận được lỗi trình biên dịch follwoing 'phương pháp của ông addFilterBefore (Filter, Class ) từ loại HttpSecurity đề cập đến thiếu loại Filter' làm thế nào tôi giải quyết này? –

Trả lời

9

Vì cấu hình ban đầu của bạn chỉ chứa hai thành phần http nên cấu hình mới của bạn chỉ được chứa hai trường hợp WebSecurityConfigurerAdapter. Mỗi cá thể WebSecurityConfigurerAdapter được ánh xạ bằng cách sử dụng http.antMatchers. Hiện tại, WebSecurityConfigurerAdapter được ánh xạ tới mọi URL.

Bạn có thể tham khảo các tài liệu tham khảo cho an example về cách sử dụng nhiều WebSecurityConfigurerAdapter trường (đó là tương đương)

Các vấn đề liên quan