Framework & Platform/Spring

spring security - javaConfig

linuxism 2013. 12. 31. 11:46


스프링 세큐리티를 자바(java config)로 설정하는 방법에 대해 배운것을 간단히 정리해둔다. 


https://github.com/SpringSource/spring-security-javaconfig 에서 제공하는 WebSecurityConfigurerAdapter 를 사용한다. 

Spring Manve Repository( http://repo.springsource.org/snapshot ) 에서 [group: 'org.springframework.security', name: 'spring-security-javaconfig', version: '1.0.0.CI-SNAPSHOT'] 으로 받아서 써도 된다. 


Spring의 EnableXXX방식과 Configurer의 방식을 모두 제공한다. 


다음 샘플을 보자. 


@Configuration

@EnableWebSecurity

public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Autowired

  AuthenticationManager authenticationManager;  // Spring Security에서 등록하는 빈을 DI 받는다. 


  @Override

  protected void ignoredRequests(IgnoredRequestRegistry ignoredRequests) {

    ignoredRequests.antMatchers("/resource/**"); // 리소스에 대해서는 처리하니 않는다. 

  }


  @Override

  protected void authorizeUrls(ExpressionUrlAuthorizations interceptUrls) {

    interceptUrls

      .antMatchers("/app/login/*", "/").permitAll()

      .antMatchers("/app/**").hasRole("ADMIN");

  }


  @Override

  protected void configure(HttpConfigurator http) throws Exception {

    configureLogin(http);

    configureLogout(http);

    configureSSOFilter(http);

  }


  protected void configureLogin(HttpConfigurator http) throws Exception {

    http

      .formLogin()

        .loginPage("/app/login/welcomeToLoginPage")  // 로그인 Form을 제공하는 페이지.

        .usernameParameter("userName")  // 로그인 폼에서 ID를 담는 Input name

.passwordParameter("password")  // 로그인 폼에서 PW를 담는 Input name

        .loginProcessingUrl("/app/login/checkLogin") // 로그인 폼에서 ID, PW를 전송해야 하는 URL

        .defaultSuccessUrl("/app/login/loginSuccess")  // 로그인에 성공했을때, Referer가 없을떄  리다이렉트될 URL. 기본구현에서는 Referer가 있으면 Referer로 이동하게 된다. 

        .failureUrl("/app/login/loginFailed") // 로그인에 실패했을때 리다이렉트 될 URL

      .permitAll(); // 이상의 로그인 과정에 필요한 URL들에 대한 접근권한을 허가함 

  }


  protected void configureLogout(HttpConfigurator http) throws Exception {

    http

      .logout()//

        . logoutUrl("/app/logout") // 로그아웃을 처리할 가상 URL

        .logoutSuccessUrl("/app/seeYouAgain")//

      .permitAll();

  }


  protected void configureSSOFilter(HttpConfigurator http) throws Exception {

    // 여기는 추가적인 필터를 등록하는 법. 대부분의 프로젝트에서 만들어지 추가적인 인증 필터는 UsernamePassword 앞에 추가되면 될듯하다

    http

      .addFilterBefore(

        casSSOAuthenticationProcessingFilter()

        , UsernamePasswordAuthenticationFilter.class

      );


  }


  // 여기는 추가적인 필터를 초기화 하는 샘플

  @Bean

  public CasSSOAuthenticationProcessingFilter casSSOAuthenticationProcessingFilter() {

    CasSSOAuthenticationProcessingFilter filter 

      = new CasSSOAuthenticationProcessingFilter("/app/casSSOLoginProcess");

    filter.setAuthenticationManager(authenticationManager);

    filter.setAuthenticationSuccessHandler(new CasLoginSuceessHandler());    

    filter.setAuthenticationFailureHandler(new CasLoginFailureHandler());

    return filter;


  }


  @Override

  protected void registerAuthentication(AuthenticationRegistry registry) throws Exception {

    // 테스트를 위한 더미 데이터기반의 인증 추가

    registry

      .inMemoryAuthentication()//

        .withUser("user").password("password").roles("USER")

        .and()//

        .withUser("admin").password("password").roles("USER", "ADMIN");

  }

}   


스프링 세큐리티를 조금 만져본 사람이면 크게 무리없이 이해될 내용일 것이다. 



출처 - http://milines.egloos.com/3953488