2013-11-21 3 views
12

그래서 최근 스프링 구성을 XML에서 Java 구성으로 마이그레이션했습니다. 이것은 Spring OAuth 2 서버이며 일부 엔드 포인트는 클라이언트 인증으로 보안되고 일부 엔드 포인트 (confirm_access)는 사용자 인증으로 보호되며 필터 ("authenticationFilter")에서 생성 된 리디렉션으로 로그인 애플리케이션에 위임됩니다. 는하지만 봄 보안 자바 설정과 동일한 작업을 수행 할 수 아니에요 :스프링 보안 Java 구성

여기

내 작업 보안 XML 구성 :

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

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


내 자바 구성 시도

이 설정으로 Spring Security는 모든 엔드 포인트에 대해 사용자를 인증하려고 시도하며 로그인 폼을 생성하므로 사용자 정의 필터가 추가되지 않습니다.
내 실수는 어디에서 왔습니까?

+0

(의 동등 함) 여러 WebSecurityConfigurerAdapter 인스턴스를 사용하는 방법 an example에 대한 참조를 참조 할 수 있습니다,하지만 난 하나를 볼 수 있습니다 귀하의 자바 기반 구성. –

+0

안녕하세요. @Eugen, 저에게 도움이되는 좋은 예입니다. 그러나 나는 HttpSecurity에서'addFilterBefore (clientCredentialsTokenEndpointFilter, BasicAuthenticationFilter.class)'를 사용할 때 다음과 같은 컴파일러 오류가 발생한다. HttpSecurity 유형에서 addFilterBefore (Filter, Class 타입 필터'어떻게 해결합니까? –

답변

9

원래 구성에는 두 개의 http 요소 만 포함되므로 새 구성에는 두 개의 WebSecurityConfigurerAdapter 인스턴스 만 포함되어야합니다. 각 WebSecurityConfigurerAdapter 인스턴스는 http.antMatchers을 사용하여 매핑됩니다. 현재 WebSecurityConfigurerAdapter은 모든 URL에 매핑됩니다.

당신은 당신이 AuthenticationManagers (OAuth는 클라이언트와 사용자에 대한)가 필요합니다

관련 문제