@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) {
web.ignoring()
.antMatchers("/assets/**"); // 이 요청들에 대해서는 spring security 필터 체인을 적용하지 않겠다
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/my-page").hasAnyRole("USER", "ADMINS") // 인증 영역 설정
.anyRequest().permitAll() // 익명 영역
.and()
.formLogin()
.defaultSuccessUrl("/")
.permitAll()
.and()
;
}
}
Using generated security password: (임시 비밀번호)
localhost:8080/my-page
로 접속
.antMatchers("/my-page").hasAnyRole("USER", "ADMINS")
중 USER나 ADMINS 권한을 가지고 있지 않기 때문에 Spring Security가 자동으로 login 페이지로 redirect 시켜주었다.user
, Password는 스프링 시큐리티가 console 창에 띄어준 임시 비밀번호로그인 후
역시나 권한이 없기 때문에 403 Forbidden
에러 페이지가 보인다.
DEBUG 10612 --- [ XNIO-1 task-2] s.s.w.c.SecurityContextPersistenceFilter:107 : Set SecurityContextHolder to SecurityContextImpl [Authentication=UsernamePasswordAuthenticationToken [Principal=org.springframework.security.core.userdetails.User [Username=user, Password=[PROTECTED], Enabled=true, AccountNonExpired=true, credentialsNonExpired=true, AccountNonLocked=true, Granted Authorities=[]], Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=wTtczobIl39mmrSL5DuBoWVbSnv9X_b6H2ACCmyd], Granted Authorities=[]]]
DEBUG 10612 --- [ XNIO-1 task-2] o.s.s.w.s.HttpSessionRequestCache :114 : Loaded matching saved request http://localhost:8080/my-page
DEBUG 10612 --- [ XNIO-1 task-2] o.s.s.w.a.i.FilterSecurityInterceptor :246 : Failed to authorize filter invocation [GET /my-page] with attributes [hasAnyRole('ROLE_USER','ROLE_ADMINS')]
DEBUG 10612 --- [ XNIO-1 task-2] o.s.s.w.access.AccessDeniedHandlerImpl :61 : Responding with 403 status code
첫번째 줄에서 Granted Authorities=[]
로 권한이 null이다.
마지막 줄에서 403 Forbidden으로 응답했음을 알 수 있다.
매번 바뀌는 사용자 비밀번호를 콘솔 창에서 띄어주고 복사해서 사용하는 것은 불편하다.
바뀌지 않는 기본 계정을 하나 만들어보자
UserDetailsServiceAutoConfiguration
클래스 확인User user = properties.getUser();
String password = user.getPassword();
우리가 설정해주고자 하는 유저 계정 정보를 property에 넣어주어야한다는 것을 알 수 있다.application.yml
security:
user:
name: user
password: (비밀번호)
roles: USER
우리가 원하는 비밀번호를 가지고 있는 User를 만들어줄 수 있다. (추후 개선)localhost:8080/my-page
로 접속DEBUG 17904 --- [ XNIO-1 task-1] w.a.UsernamePasswordAuthenticationFilter:315 : Set SecurityContextHolder to UsernamePasswordAuthenticationToken [Principal=org.springframework.security.core.userdetails.User [Username=user, Password=[PROTECTED], Enabled=true, AccountNonExpired=true, credentialsNonExpired=true, AccountNonLocked=true, Granted Authorities=[ROLE_USER]], Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress=0:0:0:0:0:0:0:1, SessionId=9XjXtSGtv9iF5_OHVSVlDMxbgsO8UK8KSWHUazEQ], Granted Authorities=[ROLE_USER]]
DEBUG 17904 --- [ XNIO-1 task-1] o.s.s.web.DefaultRedirectStrategy :57 : Redirecting to http://localhost:8080/my-page
첫번째 줄에서 Granted Authorities=[ROLE_USER]]
로그인한 유저가 ROLE_USER
라는 권한을 가지고 있음