2013-11-21 133 views
12

所以最近我將Spring配置從XML遷移到了Java配置。 這是一個Spring OAuth 2服務器,一些端點通過客戶端身份驗證進行安全保護,一些端點(confirm_access)通過用戶身份驗證進行安全保護,該身份驗證通過過濾器(「authenticationFilter」)進行重定向,委派給登錄應用程序。 但我不能夠做同樣的春季安全的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用戶端,一個用於用戶)an example,但我能看到的只是一個在你的基於java的配置中。 –

+0

你好@Eugen,這是一個很好的例子,幫助我。但我有一些問題,當我在HttpSecurity中使用'addFilterBefore(clientCredentialsTokenEndpointFilter,BasicAuthenticationFilter.class)'時,我得到了下面的編譯器錯誤'他的方法addFilterBefore(Filter,Class <?extends Filter>)從類型HttpSecurity引用丟失類型過濾器「我如何解決這個問題? –

回答

9

由於您的原始配置僅包含兩個http元素,因此您的新配置只應包含兩個WebSecurityConfigurerAdapter實例。使用http.antMatchers映射每個WebSecurityConfigurerAdapter實例。目前WebSecurityConfigurerAdapter被映射到每個URL。

您可以參考參考有關如何使用多個WebSecurityConfigurerAdapter情況下(這是相當於)

相關問題