# 권한과 역할에 따라 접근 제한
- 아래 그림은 회원의 권한과 관련된 세부 프로세스이다.
# 사용자의 권한을 기준으로 엔드포인트로의 접근 제한
- HttpSecurity 객체에는 다음과 같은 메소드가 존재한다.
- hasAuthority() - 권한 하나를 지정해서 해당 권한이 있는 사용자만 엔드포인트를 호출할 수 있다.
- hasAnyAuthority() - 여러 권한 중 하나라도 있어야 엔드포인트를 호출할 수 있다.
- access() - 아래와 같이 응용해서 사용할 수 있다. (하지만, 코드를 읽고 디버그하기 어려운 단점이 있어서 비추한다.)
http.authorizeRequests().anyRequest().access("hasAuthority('WRITE')");
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic() ;
http.authorizeRequests()
.anyRequest().permitAll() ;
}
- WRITE 권한이 있는 사용자만 엔드포인트에 접근할 수 있게 하려면 아래와 같다.
@Override
protected void configure(HttpSecurity http) throws Exception {
http.httpBasic() ;
http.authorizeRequests()
.anyRequest()
.hasAuthority("WRITE") ;
}
# 사용자 역할을 기준으로 모든 엔드포인트에 대한 접근을 제한
- 역할은 아래와 같이 "ROLE_" 로 시작한다.
- 사용방법은 아래와 같다.
@Bean
public UserDetailsService userDetailsService() {
var manager = new InMemoryUserDetailsManager() ;
var user1 = User.withUsername("john")
.password("12345")
.authorities("ROLE_ADMIN")
.build() ;
var user2 = User.withUsername("jane")
.password("12345")
.authorities("ROLE_MANAGER")
.build() ;
manager.createUser(user1);
manager.createUser(user2);
return manager ;
}
- 사용자 역할에 대한 제약 조건을 위해 다음 메소드를 활용할 수 있다.
- hasRole() - 하나의 역할을 이름 매개변수로 받는다.
- hasAnyRole() - 여러 역할 이름을 매개변수로 받는다.
- access() - SpEL 식으로 이용할 때 사용한다.