2013-11-21 39 views
12

Kısa süre önce Spring yapılandırmasını XML'den Java yapılandırmasına geçirdim. Spring OAuth 2 Sunucusudur ve bazı uç noktalar istemcilerin kimlik doğrulamasıyla güvenceye alınır ve bazı bitiş noktaları (confirm_access), kullanıcı kimlik doğrulaması ile korunur; bu, bir filtreden ("authenticationFilter") yapılan bir yönlendirmeyle oturum açma uygulamasına yetkilendirilir. Ama Bahar Güvenlik Java yapılandırma ile aynı şeyi yapmaya muktedir değilim:Yay Güvenliği Java Config

İşte

benim çalışma güvenliği XML yapılandırma:

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

İşte
<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" /> 


benim Java yapılandırma girişimidir

Bu yapılandırmada, Spring Security, tüm uç noktalar için kullanıcının kimliğini doğrulamaya çalışır ve ekrana giriş formu oluşturur, böylece özel filtre eklenmez.
Hatam nerede?

+0

(eşdeğer olan) birden WebSecurityConfigurerAdapter örneklerini nasıl kullanılacağına dair an example referansına başvurabilir, ama sadece birini görebilirsiniz java tabanlı konfigürasyonunuzda. –

+0

Merhaba @Eugen, bu harika bir örnek, bana yardım et. Ama ben HttpSecurity 'addFilterBefore (clientCredentialsTokenEndpointFilter, BasicAuthenticationFilter.class)' kullandığımda bazı sorun var, HttpSecurity türünden addfilterBefore (Filtre, Sınıf genişletir) yöntemi eksik follwoing derleyici hatası olsun Filter 'bu sorunu nasıl çözerim? –

cevap

9

Orijinal yapılandırmanızın yalnızca iki adet http öğesi bulunduğundan, yeni yapılandırmanızın yalnızca iki adet WebSecurityConfigurerAdapter örneği olması gerekir. Her bir WebSecurityConfigurerAdapter örneği, http.antMatchers kullanılarak eşlenir. Şu anda WebSecurityConfigurerAdapter, her URL'ye eşlenmiştir.

Sen iki AuthenticationManagers (OAuth müşterileri için bir tane ve kullanıcılar için bir tane) ihtiyaç

İlgili konular