web-dev-qa-db-ja.com

@RolesAllowed対@PreAuthorize対@Secured

基本的なSpringBootアプリがあります。 Spring Initializer、組み込みTomcat、Thymeleafテンプレートエンジン、およびパッケージを実行可能JARファイルとして使用します。

コントローラを保護したい:

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

さまざまなオプションがあることは知っていますが、どちらを使用すればよいのか本当にわかりません

15

セキュリティ注釈

@PreAuthorize@RolesAllowed、および@Securedはすべて、構成を可能にするアノテーションですメソッドセキュリティ。これらは、個々のメソッドまたはクラスレベルの両方に適用できます。後者の場合、セキュリティ制約はクラス内のすべてのメソッドに適用されます。

メソッドレベルのセキュリティは、 Spring AOPプロキシ を使用して実現されます。

@PreAuthorize

@PreAuthorizeアノテーションを使用すると、Spring Expression Language(SpEL)を使用してメソッドへのアクセス制限を指定できます。これらの制約はメソッドが実行される前に評価され、制約が満たされない場合、メソッドの実行が拒否される可能性があります。 @PreAuthorizeアノテーションは、Spring Securityフレームワークの一部です。

@PreAuthorizeを使用できるようにするには、@EnableGlobalMethodSecurityアノテーションのprePostEnabled属性をtrueに設定する必要があります。

@EnableGlobalMethodSecurity(prePostEnabled=true)

@RolesAllowed

@RolesAllowedアノテーションの起源は JSR-25 Java security標準。このアノテーションはロールベースのセキュリティのみをサポートするであるため、@PreAuthorizeアノテーションよりもより制限されていますです。

@RolesAllowedアノテーションを使用するには、このアノテーションを含むライブラリがSpring Securityの一部ではないため、クラスパス上にある必要があります。さらに、jsr250Enabledアノテーションの@EnableGlobalMethodSecurity属性をtrueに設定する必要があります。

@EnableGlobalMethodSecurity(jsr250Enabled=true)

@Secured

@SecuredアノテーションはレガシーSpringSecurity2アノテーションであり、メソッドのセキュリティを構成するために使用できます。役割ベースのセキュリティだけでなく、Spring Expression Language(SpEL)を使用したセキュリティ制約の指定もサポートしていません。新しいアプリケーションでは、このアノテーションよりも@PreAuthorizeアノテーションを使用することをお勧めします。

@Securedアノテーションのサポートは、securedEnabled属性を使用して、@EnableGlobalMethodSecurityアノテーションで明示的に有効にする必要があります。

@EnableGlobalMethodSecurity(securedEnabled=true)

どのセキュリティ注釈がSpELの使用を許可するか

次の表は、Spring Security5で使用できるセキュリティアノテーションでのSpringExpressionLanguageのサポートを示しています。

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

@Secured@RolesAllowedは、Springで同じ機能を実行します。違いは、@SecuredがSpring固有のアノテーションであるのに対し、@RolesAllowedはJava標準アノテーション(JSR250)です。これらのアノテーションはいずれもSpELをサポートしていません。

@PreAuthorizeは、Spring固有のもう1つのアノテーションです。 SpELを使用すると、@PreAuthorizeでより強力な操作を実行できます。役割/権限、現在認証されているユーザー、およびメソッドに渡された引数に基づいて、制限メソッド呼び出しの式を記述できます。

@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は、コードをSpringに結び付けます。 Springとの結びつきが問題にならない場合、またはより強力な操作を実行する必要がある場合は、@PreAuthorizeを使用してください。

14
Jason White

これらはすべて基本的に同じ目的ですが、@PreAuthorizeはコントローラーとコントローラーメソッドに最適です。 @Securedおよび@RolesAllowedは、サービスレイヤーのセキュリティ属性を説明するためのものです。

また、@PreAuthorizeアノテーションが機能するためには、構成クラスを定義する必要があることに注意してください。

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