基本的なSpringBootアプリがあります。 Spring Initializer、組み込みTomcat、Thymeleafテンプレートエンジン、およびパッケージを実行可能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
を使用できるようにするには、@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)
次の表は、Spring Security5で使用できるセキュリティアノテーションでのSpringExpressionLanguageのサポートを示しています。
╔═════════════════════╦═══════════════════╗
║ Security Annotation ║ Has SpEL Support? ║
╠═════════════════════╬═══════════════════╣
║ @PreAuthorize ║ yes ║
╠═════════════════════╬═══════════════════╣
║ @PostAuthorize ║ yes ║
╠═════════════════════╬═══════════════════╣
║ @PreFilter ║ yes ║
╠═════════════════════╬═══════════════════╣
║ @PostFilter ║ yes ║
╠═════════════════════╬═══════════════════╣
║ @Secured ║ no ║
╠═════════════════════╬═══════════════════╣
║ @RolesAllowed ║ no ║
╚═════════════════════╩═══════════════════╝
@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) {
...
}
どちらを使用するかは、あなた次第です。 @Secure
および@PreAuthorize
は、コードをSpringに結び付けます。 Springとの結びつきが問題にならない場合、またはより強力な操作を実行する必要がある場合は、@PreAuthorize
を使用してください。
これらはすべて基本的に同じ目的ですが、@PreAuthorize
はコントローラーとコントローラーメソッドに最適です。 @Secured
および@RolesAllowed
は、サービスレイヤーのセキュリティ属性を説明するためのものです。
また、@PreAuthorize
アノテーションが機能するためには、構成クラスを定義する必要があることに注意してください。
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration {
...
}