☕ Java 설정 추가

web.xml이 없고 WebConfig 클래스를 추가한 상태에선

// 내부적으로 `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')");
    }
}

WebConfig 클래스

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

🔏 PasswordEncoder 지정

//SecurityConfig.java 추가
@Bean
public PasswordEncoder passwordEncoder()
{
    return new BcrpytPasswordEncoder();
}
//PasswordEncoder 주입 받은 후 bcrypt.encode(문자열);

⚙ JDBC를 이용한 Java 설정

  1. username사용자의 정보를 얻어오는 과정
  2. 적당한 권한 등을체크하는 과정
//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);
}