@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {
private final FormAuthenticationProvider formAuthenticationProvider;
private final RestAuthenticationProvider restAuthenticationProvider;
private final AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> authenticationDetailsSource;
private final FormAuthenticationSuccessHandler formSuccessHandler;
private final FormAuthenticationFailureHandler formFailureHandler;
/**
* 폼 인증 설정
*/
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/css/**", "/js/**", "/images/**", "/webjars/**", "/favicon.*", "/*/icon-*").permitAll() //정적 자원 관리
.requestMatchers("/", "/signup", "/login*").permitAll()
.requestMatchers("/user").hasRole("USER")
.requestMatchers("/manager").hasRole("MANAGER")
.requestMatchers("/admin").hasRole("ADMIN")
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login").permitAll()
.authenticationDetailsSource(authenticationDetailsSource)
.successHandler(authenticationSuccessHandler)
.failureHandler(authenticationFailureHandler)
)
.authenticationProvider(authenticationProvider)
.exceptionHandling(exception -> exception
.accessDeniedHandler(new FormAccessDeniedHandler("/denied"))
)
;
return http.build();
}
/**
* 비동기 인증 설정
*/
@Bean
@Order(1)
public SecurityFilterChain restSecurityFilterChain(HttpSecurity http) throws Exception {
AuthenticationManagerBuilder managerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);
managerBuilder.authenticationProvider(restAuthenticationProvider); //추가
AuthenticationManager authenticationManager = managerBuilder.build();
http
.securityMatcher("/api/login")
.authorizeHttpRequests(auth -> auth
.requestMatchers("/css/**", "/js/**", "/images/**", "/webjars/**", "/favicon.*", "/*/icon-*").permitAll() //정적 자원 관리
.anyRequest().permitAll()
)
.csrf(AbstractHttpConfigurer::disable)
.addFilterBefore(restAuthenticationFilter(authenticationManager), UsernamePasswordAuthenticationFilter.class)
.authenticationManager(authenticationManager)
;
return http.build();
}
private RestAuthenticationFilter restAuthenticationFilter(AuthenticationManager authenticationManager) {
RestAuthenticationFilter restAuthenticationFilter = new RestAuthenticationFilter();
restAuthenticationFilter.setAuthenticationManager(authenticationManager);
return restAuthenticationFilter;
}
}