Path설계를 잘못하면 위와 같은 페이지를 만날 수 있다. Security에서 Path의 권한 설정은 위에서 부터 차례대로 적용된다. 아래의 코드를 보면 anyRequest()는 “USER"권한을 가지고 접근가능하지만 로그인을 하기위한 .antMatchers(”/users/login")는 로그인 하지 않은 ANONYMOUS를 포함한 모든 권한을 다 받아 들인다. 따라서 처리 순서는 다음과 같이 된다.
- 사용자는
/
으로 접근할 것이다. 이때 사용자는 로그인 하지 않았으므로ANONYMOUS
권한을 가지고 있다. 하지만.anyRequest() .hasRole("USER")
에 의해/
는USER
권한이 있어야 접근 가능하므로 Security는 요청을 로그인페이지로 리다이렉트 시킬것이다/users/login
페이지의 권한은.permitAll()
이지만anyRequest()
의 범위에.antMatchers ("/users/login")
가 포함될 뿐만 아니라 Path의 권한 설정은 위에서 부터 차례대로 적용된다고 했으므로 이미USER
권한이 적용되어 로그인페이지에 대한 권한은USER
인데 사용자는ANONYMOUS
권한을 가지고 있으므로 권한이 일치하지 않아 인증 실패로 Security는 계속 로그인 페이지로 리다이렉트 시킬것이다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/h2-console/**").permitAll()
.anyRequest().hasRole("USER")
.antMatchers("/users/login").permitAll()
...
}
실제로 크롬 디버깅툴로 확인해보면 다음과 같이 계속 login페이지를 계속 요청하는 것을 볼 수 있다
이것을 해결하려면 범위가 좁은 /users/login
패스의 권한 설정을 다음과 같이 전체 패스 설정 위로 올려준다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/h2-console/**").permitAll()
.antMatchers("/users/login").permitAll()
.anyRequest().hasRole("USER")
...
}
'Java > SpringBoot' 카테고리의 다른 글
리멤버미 권한 오류 (0) | 2018.09.02 |
---|---|
template might not exist or might not be accessible by any of the configured Template Resolvers (3) | 2018.08.24 |