로그인 과정 3가지
1. 아이디와 비밀번호를 보낸다.
2. 시간제한 있는 임시 아이디를 보낸다
3. 일정 시간 동안 인가에 유효한 정보로 대체한다.(JWT)
'JWT'를 쓰면 인가가 수월함. 서버가 유저 정보를 갖고 있으므로 데이터에서 유저의 권한 정보도 읽어들이면 됨.implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.security:spring-security-test'
@Configuration
@EnableWebSecurity --(1)
public class SecurityConfig extends WebSecurityConfigurerAdapter { --(2)
@Override
protected void configure(HttpSecurity http) throws Exception { --(3)
http
.authorizeRequests() --(4)
.anyRequest().authenticated();
http
.formLogin(); --(5)
}
}
WebSecurityConfigurerAdapter 를 상속 받아야 HttpSecurity를 사용할 수 있다HttpSecurity클래스를 이용해 인증 API 와 인가 API 설정을 해준다@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated();
http
.formLogin()
.loginPage("/loginPage") //사용자 정의 로그인 페이지
.defaultSuccessUrl("/") //로그인 성공 후 이동페이지
.failureUrl("/login") //로그인 실패 후 이동페이지
.usernameParameter("userId") //아이디 파라미터명 설정
.passwordParameter("passwd") //패스워드 파라미터명 설정
.loginProcessingUrl("/login_proc") //로그인Form Action Url
.successHandler(new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
System.out.println("authentication : " + authentication.getName());
System.out.println("getAuthorities : " + authentication.getAuthorities());
System.out.println("getCredentials : " + authentication.getCredentials());
System.out.println("getDetails : " + authentication.getDetails());
System.out.println("getClass : " + authentication.getClass());
response.sendRedirect("/");
}
})
.failureHandler(new AuthenticationFailureHandler() {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
System.out.println("getMessage : " + exception.getMessage());
System.out.println("getCause : " + exception.getCause());
System.out.println("getStackTrace : " + exception.getStackTrace());
System.out.println("getLocalizedMessage : " + exception.getLocalizedMessage());
System.out.println("getSuppressed : " + exception.getSuppressed());
response.sendRedirect("/login");
}
})
.permitAll() // 위에 인가API 설정에서 모든 페이지 인가 필요하다 설정하였는데
;
}