ICT Intern/Spring Security

[Spring] Spring Security - Config 알아보기

칸타탓 2019. 4. 2. 10:14

SecurityConfig.java

 

@Configuration
스프링 시큐리티에 관련된 기본적인 사항들(인증필터 등)이 설정된다.

 

@EnableWebSecurity
WebSecurityConfigurerAdapter를 상속하면 이미 설정된 기본값에 추가값을 오버라이드해 설정할 수 있다.

//특정 요청에 대해서는 시큐리티 설정을 무시하도록 하는 등 전체에 관한 설정을 한다 
@Override 
public void configure(WebSecurity web) throws Exception { 
	//static files 
	//webjars, resources와 같은 정적 저장소에 접근하면 시큐리티 설정을 무시하도록 한다 .
	web.ignoring().antMatchers("/resources/**","/webjars/**"); 
}
//configure 메서드 오버라이드 후 인가, 로그인, 로그아웃을 설정한다
@Override
protected void configure(HttpSecurity http) throws Exception {
	CharacterEncodingFilter filter = new CharacterEncodingFilter();
    filter.setEncoding("UTF-8");
    filter.setForceEncoding(true);

    http.headers().frameOptions().disable();
    http.addFilterBefore(filter, CsrfFilter.class)
    	//인가 관련 설정하기
    	.authorizeRequests()
        //permitAll: 모든 사용자가 접속할 수 있게한다.
        .antMatchers("/admin").permitAll()
        //그 외 경로로는 인증없이 이동할 수 없도록 설정한다.
        .anyRequest().authenticated();
     //로그인 관련 설정하기
     //폼 인증처리 유효화, 인증처리 경로 설정
     http.formLogin()
     	//로그인처리 경로
     	.loginProcessingUrl("/login")
        //로그인 폼 표시 경로
        .loginPage("/loginForm")
        //인증에 실패했을 때 경로
        .failureUrl("/loginForm?error")
        //인증에 성공햤을 때 넘어가는 곳
        .defaultSuccessUrl("/customers", true)
        //사용자 이름과 암호 관련 파라미터 이름 설정
        .usernameParameter("username").passwordParameter("password")
        .and();
     //로그아웃 관련 설정
     //AntPathRequestMatcher 클래스를 사용하지 않고 문자열 경로를 지정했을 때, 로그아웃은 POST로 접속해야 한다.
     http.logout()
     	//로그아웃 처리 경로
     	.logoutRequestMatcher(new AntPathRequestMatcher("/logout**"))
        //로그아웃이 처리됐을 때 넘어갈 곳 설정한다.
        .logoutSuccessUrl("/loginForm");
  }
@Configuration
//GlobalAuthenticationConfigurerAdapter를 상속한 클래스에서 인증 처리에 관련된 사항들을 설정
static class AuthenticationConfiguration extends GlobalAuthenticationConfigurerAdapter {
	@Autowired
    UserDetailService userDetailService;
    
    @Bean
    //암호를 해시 형식으로 만들기 위한 클래스
    PasswordEncoder passwordEncoder() {
    	//어떤 해싱 알고리즘을 사용할건지 결정
    	return new BCryptPasswordEncoder();
    }
    
    @Override
    //인증 처리 관련 설정을 한다.
    public void init(AuthenticationManagerBuilder auth) throws Exception {
    	//이 부분에서는 인증 처리를 위해 사용자를 가져오는 userDetailsService와
    	//암호를 대조할 때 사용하는 passwordEncoder를 설정한다. 
    	auth.userDetailsService(userAuthService);
        	.passwordEncoder(passwordEncoder());
    }
}