이번 글에서는 user에 이어 admin과 manager도 권한처리를 해보자.
manager라는 이름과 admin이라는 이름으로 일단 회원가입을 진행한다.
User role을 디폴트 값으로 user로 등록했기 때문에 이를 일단 수정해준다.
update user set role = 'ROLE_MANAGER' where id = 5;
update user set role = 'ROLE_ADMIN' where id = 6;
COMMIT;
이렇게하고 다시 로그인 페이지로 가서 매니저로 로그인을 하면
먼저 인덱스 페이지가 나오고
매니저에게 접근 권한이 있는 user페이지 manager페이지는 정상적으로 호출되지만, admin페이지에는 접근할 수 없는 것을 확인할 수 있다!
admin으로 로그인하면 모든 페이지에 접근할 수 있다.
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig {
상단에 EnableGlobalMethodSecurity 어노테이션 추가
@GetMapping("/info")
public @ResponseBody String info(){
return "개인정보";
}
맨 아래 info() 메소드를 추가했다.
이렇게하면 로그인이 되어있던 안되어있던 info페이지로의 이동이 가능하다.
아까 적어준
@EnableGlobalMethodSecurity(securedEnabled = true)는
secured 어노테이션을 활성화하는 것인데 이렇게하고
@Secured("ROLE_ADMIN")
@GetMapping("/info")
public @ResponseBody String info(){
return "개인정보";
}
아까 작성한 info()메소드 위에 Secured 어노테이션을 다음과 같이 추가하면
info페이지로의 이동이 불가능하게 된다.
매니저로 로그인하여 info페이지에 접근하려는 경우
ROLE_ADMIN만 접근할 수 있도록 허용해두었기 때문에 user나 manager에게도 접근 권한이없다.
이전 방식에서는 SecurityConfig에 하나하나 .antMatchers로 걸어 권한을 주었는데(글로벌로 주고싶을 때),
특정 메소드 하나에 간단하게 권한을 걸고 싶을 때 이 방법을 사용하면된다.
하나 더 알아보자
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class SecurityConfig {
prePostEnabled = true를 추가했다.
이렇게하면 preAuthorize 어노테이션이 활성화된다.
@PreAuthorize("hasRole('ROLE_MANAGER') or hasRole('ROLE_ADMIN')")
@GetMapping("/data")
public @ResponseBody String data(){
return "데이터 정보";
}
data() 메소드를 추가했다.
하나에게만 접근권한을 간단하게 주려면 아까처럼 @Secure를 사용하고
이번에는 @PreAuthorize 어노테이션을 사용해 manager와 admin에게 접근 권한을 주었다.
manager, admin으로 접근할 시 나오는 페이지