코드스테이츠 백엔드 부트캠프 64일차 - Spring Security의 권한 부여

wish17·2023년 3월 17일
0
post-thumbnail

Spring Security의 권한 부여

Spring Security의 권한 부여 처리 흐름

AuthorizationFilter 클래스

  • Spring Security Filter Chain에서 URL을 통해 사용자의 액세스를 제한하는 권한 부여 Filter

AuthorizationManager 인터페이스

  • 권한 부여 처리를 총괄하는 매니저 역할을 하는 인터페이스

RequestMatcherDelegatingAuthorizationManager 클래스

  • AuthorizationManager 를 구현하는 구현체 중 하나
  • RequestMatcherDelegatingAuthorizationManager 가 직접 권한 부여 처리를 하는 것이 아니라 RequestMatcher를 통해 매치되는 AuthorizationManager 구현 클래스에게 위임만 한다.

  1. AuthorizationFilterSecurityContextHolder로 부터 Authentication을 획득

  2. 획득한AuthenticationHttpServletRequest를 AuthorizationManager 에게 전달

  3. RequestMatcherDelegatingAuthorizationManager 내부에서 매치되는 AuthorizationManager 구현 클래스가 있다면 해당 AuthorizationManager 구현 클래스가 사용자의 권한을 체크

Spring Security의 권한 부여 컴포넌트

AuthorizationFilter 클래스

  • URL을 통해 사용자의 액세스를 제한하는 권한 부여 Filter

  • 객체를 생성할 때, AuthorizationManager를 DI 받는다.

  • DI 받은 AuthorizationManagercheck() 메서드를 호출해 적절한 권한 부여인지에 대한 여부를 체크한다.

    • AuthorizationManager 구현 클래스에 따라 권한 체크(check()) 로직이 다르다.

AuthorizationManager 인터페이스

  • 권한 부여 처리를 총괄하는 매니저 역할을 하는 인터페이스
  • check() 메서드 하나만 정의되어 있다.
    • check() 메서드는 Supplier와 제너릭 타입의 객체를 파라미터로 갖는다.
@FunctionalInterface
public interface AuthorizationManager<T> {

	@Nullable
	AuthorizationDecision check(Supplier<Authentication> authentication, T object);

}

RequestMatcherDelegatingAuthorizationManager 클래스

  • AuthorizationManager의 구현 클래스 중 하나

  • 직접 권한 부여 처리를 수행하지 않고 RequestMatcher를 통해 매치되는 AuthorizationManager 구현 클래스에게 권한 부여 처리를 위임한다.

    • RequestMatcherSecurityConfiguration에서 .antMatchers("/orders/**").hasRole("ADMIN") 와 같은 메서드 체인 정보를 기반으로 생성된다.

접근 제어 표현식

Spring Security에서 지원하는 표현식은 아래와 같다.

표현식설명
hasRole(Stirng role)- 현재 보안 주체(principal)가 지정된 역할을 갖고 있는지 여부를 확인하고 가지고 있다면 true를 리턴한다.
- hasRole(’admin’)처럼 파라미터로 넘긴 role이 ROLE_ 로 시작하지 않으면 기본적으로 추가한다.
(DefaultWebSecurityExpressionHandler의 defaultRolePrefix를 수정하면 커스텀할 수 있다.)
hasAnyRole(String… roles)- 현재 보안 주체가 지정한 역할 중 1개라도 가지고 있으면 true를 리턴한다.
(문자열 리스트를 콤마로 구분해서 전달한다.)
- ex) hasAnyRole(’admin’, ‘user’)
hasAuthority(String authority)- 현재 보안 주체가 지정한 권한을 갖고 있는지 여부를 확인하고 가지고 있다면 true를 리턴한다.
- ex) hasAuthority(’read’)
hasAnyAuthority(String… authorities)- 현재 보안 주체가 지정한 권한 중 하나라도 있으면 true를 리턴한다.
- ex) hasAnyAuthority(’read’, ‘write’)
principal- 현재 사용자를 나타내는 principal 객체에 직접 접근할 수 있다.
authentication- SecurityContext로 조회할 수 있는 현재 Authentication 객체에 직접 접근할 수 있다.
permitAll- 항상 true로 평가한다.
denyAll- 항상 false로 평가한다.
isAnonymous()- 현재 보안 주체가 익명 사용자면 true를 리턴한다.
isRememberMe()- 현재 보안 주체가 remember-me 사용자면 true를 리턴한다.
isAuthenticated()- 사용자가 익명이 아닌 경우 true를 리턴한다.
isFullyAuthenticated()- 사용자가 익명 사용자나 remember-me 사용자가 아니면 true를 리턴한다.
hasPermission(Object target, Object permission)- 사용자가 target에 해당 permission 권한이 있으면 true를 리턴한다.
ex) hasPermission(domainObject, ‘read’)
hasPermission(Object targetId, String targetType, Object permission)- 사용자가 target에 해당 permission 권한이 있으면 true를 리턴한다.
ex) hasPermission(1, ‘com.example.domain.Message’, ‘read’)

0개의 댓글