programing

@Roles Allowed vs. @PreAuthorize vs. @Secured

lovejava 2023. 3. 15. 17:45

@Roles Allowed vs. @PreAuthorize vs. @Secured

기본적인 Spring Boot 앱이 있습니다.Spring Initializer, Embedded Tomcat, Tymeleaf 템플릿엔진 및 패키지를 실행 가능한 JAR 파일로 사용합니다.

컨트롤러를 보호하려고 합니다.

@Controller
@RequestMapping("/company")
@RolesAllowed({"ROLE_ADMIN"})
@PreAuthorize("hasRole('ADMIN')")
@Secured("ADMIN")
public class CompanyController {
}

여러 가지 옵션이 있다는 것은 알지만 어떤 옵션을 사용해야 할지 잘 모르겠습니다.

보안 주석

의 모든@PreAuthorize,@RolesAllowed그리고.@Secured메서드 보안을 설정할 수 있는 주석입니다.이러한 제한은 개별 메서드 또는 클래스레벨 모두에 적용할 수 있습니다.후자의 경우 보안 제약이 클래스 내의 모든 메서드에 적용됩니다.

메서드 레벨의 보안은 Spring AOP 프록시를 사용하여 실현됩니다.

@PreAuthorize

@PreAuthorize 주석을 사용하면 Spring Expression Language(SpEL)를 사용하여 메서드에 대한 액세스 제한을 지정할 수 있습니다.이러한 제약조건은 메서드가 실행되기 전에 평가되며 제약조건이 충족되지 않으면 메서드의 실행이 거부될 수 있습니다.@PreAuthorize주석은 Spring Security 프레임워크의 일부입니다.

사용할 수 있도록@PreAuthorize, 의 Atribute@EnableGlobalMethodSecurity주석을 다음으로 설정해야 합니다.true:

@EnableGlobalMethodSecurity(prePostEnabled=true)

@RolesAllowed

@RolesAllowed 주석은 JSR-250 Java 보안 표준에서 유래합니다.이 주석은 다음 주석에 비해 더 제한적입니다.@PreAuthorize주석 기능은 역할 기반 보안만 지원하므로 주석 기능을 사용할 수 있습니다.

를 사용하려면@RolesAllowed주석은 스프링 보안에 속하지 않으므로 이 주석을 포함하는 라이브러리가 클래스 경로에 있어야 합니다.또한 의 Atribute는@EnableGlobalMethodSecurity주석을 다음으로 설정해야 합니다.true:

@EnableGlobalMethodSecurity(jsr250Enabled=true)

@Secured

@Secured annotation은 기존 Spring Security 2 주석으로 메서드보안 설정에 사용할 수 있습니다.역할 기반 보안뿐만 아니라 Spring Expression Language(SPEL; 스프링 표현 언어)를 사용하여 보안 제약 조건을 지정할 수도 없습니다.를 사용할 것을 권장합니다.@PreAuthorize이 주석 위에 새 응용 프로그램의 주석을 추가합니다.

에 대한 지원@Secured주석을 명시적으로 활성화해야 합니다.@EnableGlobalMethodSecurity다음 속성을 사용하여 주석을 사용합니다.

@EnableGlobalMethodSecurity(securedEnabled=true)

SpEL을 사용할 수 있는 보안 주석

다음 표는 Spring Security 5에서 사용할 수 있는 보안 주석의 Spring Expression Language 지원을 보여 줍니다.

╔═════════════════════╦═══════════════════╗
║ Security Annotation ║ Has SpEL Support? ║
╠═════════════════════╬═══════════════════╣
║  @PreAuthorize      ║        yes        ║
╠═════════════════════╬═══════════════════╣
║  @PostAuthorize     ║        yes        ║
╠═════════════════════╬═══════════════════╣
║  @PreFilter         ║        yes        ║
╠═════════════════════╬═══════════════════╣
║  @PostFilter        ║        yes        ║
╠═════════════════════╬═══════════════════╣
║  @Secured           ║        no         ║
╠═════════════════════╬═══════════════════╣
║  @RolesAllowed      ║        no         ║
╚═════════════════════╩═══════════════════╝

@Secured ★★★★★★★★★★★★★★★★★」@RolesAllowed이치노 점은 '하다'는 것입니다.@Secured이며, Annotaiton은 다음과 같습니다.@RolesAllowedJava (JSR250) 。SpEL을 사용하다

@PreAuthorize하다 하다 보면 더 강력한 조작을 할 수 .@PreAuthorizeSPEL을 사용하다메서드에 전달된 역할/권한, 현재 인증된 사용자 및 인수를 기반으로 메서드 호출 제한 식을 작성할 수 있습니다.

@PreAuthorize("hasRole('ADMIN') or #user.id == authentication.name")
public void deleteUser(User user) {
    ...
}

http://docs.spring.io/autorepo/docs/spring-security/4.0.x/reference/html/el-access.html#el-common-built-in


어떤 것을 사용할지는 당신에게 달려 있습니다. @Secure ★★★★★★★★★★★★★★★★★」@PreAuthorize가 되지 않거나 를 하십시오.@PreAuthorize.

과 동일하지만, 이것은 의 목적과 같습니다.@PreAuthorize는 컨트롤러 및 컨트롤러 방식에 가장 적합합니다. @Secured ★★★★★★★★★★★★★★★★★」@RolesAllowed는 서비스 레이어 보안 Atribute를 기술하는 것을 목적으로 하고 있습니다.

also, 음 also, 음음, 음음 도 주의해 주세요.@PreAuthorize주석 기능을 사용하려면 구성 클래스를 정의해야 합니다.

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
...
}

언급URL : https://stackoverflow.com/questions/43961625/rolesallowed-vs-preauthorize-vs-secured