CustomPermissionEvaluator
는 주어진 권한과 대상 객체를 기반으로 권한 검증을 수행합니다. determineUserRole 로 결정된 사용자의 권한으로 api에 접근할 수 있는가를 알려줍니다.
PermissionEvaluator
: 이 클래스는 주로 Spring Security의 @PreAuthorize 및 @Secured 어노테이션과 함께 사용되며, 특정 도메인 객체와 권한객체를 기반으로 사용자 권한을 평가합니다. 기본적으로 Authentication이 targetDomainObject에 대해 가지고 있는 권한수준을 의미합니다. 지금 판단해야하는건 현재 로그인 중인 사용자가 블로그에 어떤 권한을 가지고 있는가입니다.
Authentication authentication
: 현재 인증된 사용자의 정보를 담고 있는 객체입니다.Object targetDomainObject
: 검증할 특정 도메인 객체의 ID나, 객체 자체가 될 수 있습니다. (해당 도메인에 접근할 수 있는가)Object permission
: targetDomainObject에게 접근하기 위해 사용자에게 요구되는 권한 수준을 정의한다. @PreAuthorize에서 정한 role이 들어가게된다. @Bean
public MethodSecurityExpressionHandler methodSecurityExpressionHandler() {
DefaultMethodSecurityExpressionHandler handler = new DefaultMethodSecurityExpressionHandler();
handler.setPermissionEvaluator(permissionEvaluator);
return handler;
}
사용자가 아이디와 비밀번호 입력
클라이언트가 전송한 인증 정보는 UsernamePasswordAuthenticationToken 객체로 생성
AuthenticationManager는 ProviderManager에게 인증을 위임
UserDetailsService 인터페이스를 구현한 클래스의 loadUserByUsername 메서드를 사용해서 사용자의 정보를 데이터베이스에서 가져옴. 여기선 아이디만 가져가서 사용자 정보를 가져오고 이걸 UserDetails 객체로 만들어서 반환
UserDetails 객체와 클라이언트가 제공한 아이디, 비밀번호를 비교하여 사용자를 인증, 여기서는 블로그의 아이디와 입력받은 아이디를 비교해서 권한까지 설정
인증에 성공하면 AuthenticationProvider는 인증된 사용자를 나타내는 Authentication 객체를 생성
이 정보는 Spring Security의 SecurityContextHolder에 설정
API 요청이 컨트롤러로 전달
@PreAuthorize 어노테이션으로 인해 내부적으로 CustomPermissionEvaluator를 호출하여 권한 검증을 수행