web.xml이 없고 WebConfig 클래스를 추가한 상태에선
getServletFilters()를 이용해 직접 스프링 시큐리티 관련 필터를 추가하는 방법AbstractSecurityWebApplicationInitializer를 상속하는 클래스 추가하는 방법// 내부적으로 `DelegatingFilterProxy`를 스프링에 등록한다.
// 클래스 추가만 하면 설정 완료
public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer(){}
@Configuration
@EnableWebSecurity // 스프링 MVC와 시큐리티를 결합하는 용도
@Log4j2
public class SecurityConfig extends WebSecurityConfigurerAdapter
{
//xml에서 <security:http> 관련 설정을 대신함
@Override
public void configure(HttpSecurity http) throws Exception
{
http.authorizeRequests()
.antMatchers("/sample/all").permitAll()
.antMatchers("/sample/admin").access("hasRole('ROLE_ADMIN')")
.antMatchers("/sample/member").access("hasRole('ROLE_MEMBER')");
}
}
public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer
{
@Override
protected Class<?>[] getRootConfigClasses()
{
return new Class[] {RootConfig.class, SecurityConfig.class};
}
...
}
// SecurityConfig.java
public void configure(HttpSecurity http) throws Exception
{
// 추가. Access Denied 후 로그인 페이지로 이동하고 로그인을 할 수 있는 설정
http.formLogin().loginPage("/customLogin").loginProcessingUrl("/login");
}
protected void configure(AuthenticationManagerBuilder auth) throws Exception
{
auth.inMemoryAuthentication().withUser("admin").password("{noop}admin").roles("ADMIN");
}
// SecurityConfig.java 추가
@Bean
public AuthenticationSuccessHandler loginSuccessHandler()
{
return new CustomLoginSuccessHandler();
}
public void configure(HttpSecurity http) throws Exception
{
http.formLogin().loginPage("/customLogin")
.loginProcessingUrl("/login")
.successHandler(loginSuccessHandler());// successHandler()추가
}
//SecurityConfig.java 추가
public void configure(HttpSecurity http) throws Exception
{
http.logout().logoutUrl("/customLogout")
.invalidateHttpSession(true)
.deleteCookies("remeber-me", "JSESSION_ID");
}
//SecurityConfig.java 추가
@Bean
public PasswordEncoder passwordEncoder()
{
return new BcrpytPasswordEncoder();
}
//PasswordEncoder 주입 받은 후 bcrypt.encode(문자열);
//SecurityConfig.java 수정
@Autowired
private DataSource dataSource;
protected void configure(AuthenticationManagerBuilder auth) throws Exception
{
String user = "SELECT userid, userpw, enalbed FROM tbl_member WHERE userid=?";
String details = "SELECT userid, auth FROM tbl_member_auth WHERE userid=?";
auth.jdbcAuthentication().dataSource(dataSource)
.passwordEncoder(passwordEncoder())
.usersByUsernameQuery(user)
.authoritiesByUsernameQuery(details);
}