Spring Security @PreAuthorize, @PostAuthorize, @Secured

반응형

Spring Security에서 메서드 수준 접근 제어를 위해 사용되는 어노테이션들이 있습니다. 이 어노테이션들을 사용하여 메서드의 실행 전후에 인가 검사를 수행하여 접근 권한을 제어할 수 있습니다.


@PreAuthorize

 메소드가 실행되기 전에 인가(Authorization)를 검사하는데 사용됩니다. 메소드의 실행 전에 지정된 스프링 EL(SpEL) 표현식을 평가하고, 표현식이 true인 경우에만 메소드가 실행됩니다. 인가 검사를 통과하지 못하면 예외가 발생하며, 메소드 실행은 중지됩니다.

@PreAuthorize("hasRole('ROLE_ADMIN')")
public void deleteUser(int userId) {
    // ...
}

@PostAuthorize

메소드 실행 후에 인가(Authorization)를 검사하는데 사용됩니다. 메소드의 실행이 완료된 후에 지정된 스프링 EL 표현식을 평가하고, 표현식이 true인 경우에만 메소드의 결과를 반환합니다. 인가 검사를 통과하지 못하면 예외가 발생하며, 메소드의 결과는 제공되지 않습니다.

@PostAuthorize("returnObject.userId == authentication.principal.username")
public Order getOrder(int orderId) {
    // ...
    return order;
}

`getOrder` 메서드가가 실행된 후에 현재 사용자가 주문의 소유자인지 검사합니다. 주문의 소유자가 아닌 경우 예외가 발생하고, 메서드의 결과가 제공되지 않습니다.


@Secured

Spring Security에서 메소드 수준의 접근 제어를 구현하기 위해 사용되는 어노테이션입니다. 이 어노테이션을 메소드에 추가하여 해당 메소드에 접근할 수 있는 권한을 명시적으로 지정할 수 있습니다.

@Secured("ROLE_ADMIN")
public void adminOnlyAccessMethod() {
    // ...
}

`@Secured({"ROLE_ADMIN, "ROLE_MANAGER"})` 과 같이 여러 개의 권한을 지정할 수도 있습니다.


설정 방법!!

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled=true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    // ...
}

표현식

@PreAuthorize("isAuthenticated()")

@PreAuthorize("hasRole('ROLE_ADMIN')")

@PreAuthorize("hasAnyRole('ROLE_ADMIN', ''ROLE_MEMBER')")

@PreAuthorize("principal.username == #member.name")
표현식 설명
hasRole([role])
hasAuthority([authority])
권한이 지정된 권한인 경우 true
hasAnyRole([role1,role2])
hasAnyAuthority([authority])
여러 권한 중 해당 하는 권한이 있는 경우 true
principal 현재 사용자 정보(User)를 직접 접근할 수 있다.
permitAll 모든 사용자 허용
denyAll 모든 사용자 거부
authentication
SecurityContext에 있는 authentication 객체에 접근 가능
isAnonymous() 익명(로그인하지 않은) 상태인 경우 true
isAuthenticated() 인증된(로그인 한) 상태인 경우 true
isRememberMe() Remember-me 사용자인 경우 true
isFullyAuthenticated() Remember-me 사용자는 아니지만 인증된(로그인 한) 상태인 경우 true

 

hasRole를 사용하는 경우 표현식 지정시 앞에 접두어인 'ROLE_'을 생략해줄 수 있다.

반응형