こんにちは!
今回はSpring Securityでよく使われる@PostAuthorize
と@PreAuthorize
アノテーションについて、初心者の方でもわかりやすく解説します。このアノテーションを活用することで、Webアプリケーションのセキュリティ設定が格段に楽になります。
「認可処理」と聞くと難しく感じるかもしれませんが、このアノテーションを覚えれば直感的に権限管理ができるようになります!
@PreAuthorizeと@PostAuthorizeとは?
1. @PreAuthorizeとは?
**「メソッドの実行前に、指定した条件を満たしているかチェックするためのアノテーション」**です。
たとえば、特定のユーザーだけがアクセスできるようにする場合に使用します。
使い方の例
@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin")
public String adminPage() {
return "admin";
}
この例では、/admin
にアクセスする際、ADMIN権限を持つユーザーのみがこのメソッドを実行できます。
2. @PostAuthorizeとは?
**「メソッド実行後に、その結果に基づいてアクセスを許可するかチェックするためのアノテーション」**です。
結果に応じた動的な認可が必要な場面で役立ちます。
使い方の例
@PostAuthorize("returnObject.owner == authentication.name")
@GetMapping("/profile")
public UserProfile getProfile() {
// ユーザーのプロフィールを取得
return userProfileService.getProfile();
}
この例では、ログインユーザーが取得したプロフィールの所有者である場合のみ、処理を許可します。メソッドの戻り値(returnObject
)に対して条件を設定できます。
@PreAuthorizeと@PostAuthorizeの設定方法
これらを使用するには、以下の設定が必要です。
Spring Security依存関係の追加
Mavenプロジェクトの場合、pom.xml
に以下を追加します。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
アノテーションの有効化@EnableGlobalMethodSecurity
を使って、アノテーションを有効にします。
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// セキュリティ設定
}
@PreAuthorizeの活用例【基本編】
1. 権限チェック
特定の権限を持つユーザーのみ実行可能にする例です。
@PreAuthorize("hasRole('USER')")
@GetMapping("/user")
public String userPage() {
return "user";
}
hasRole('USER')
は、現在のユーザーがROLE_USER
を持つか確認します。
2. 複数条件の組み合わせ
条件を柔軟に組み合わせることもできます。
@PreAuthorize("hasRole('ADMIN') or hasRole('MANAGER')")
@GetMapping("/dashboard")
public String dashboard() {
return "dashboard";
}
ここでは、ADMINまたはMANAGER権限を持つユーザーがアクセスできます。
@PostAuthorizeの活用例【応用編】
1. 動的な認可
メソッドの戻り値を基にアクセス制御を行います。
@PostAuthorize("returnObject.owner == authentication.name")
@GetMapping("/document/{id}")
public Document getDocument(@PathVariable Long id) {
return documentService.getDocumentById(id);
}
この例では、取得したDocument
オブジェクトのowner
が現在ログインしているユーザーと一致する場合のみ、処理を許可します。
2. 複雑な条件を使用する
@PostAuthorize
では、戻り値だけでなく、メソッドの引数も条件に組み込むことが可能です。
@PostAuthorize("#userId == authentication.name or hasRole('ADMIN')")
@GetMapping("/user/{userId}")
public UserDetails getUserDetails(@PathVariable String userId) {
return userService.getUserById(userId);
}
この例では、現在ログインしているユーザーが対象ユーザーか、もしくはADMIN権限を持っている場合のみ、処理を許可します。
セキュリティ式で使用可能な関数
関数 | 説明 |
---|---|
hasRole(role) | 指定されたロールを持つ場合にtrue を返す |
hasAuthority(auth) | 指定された権限を持つ場合にtrue を返す |
authentication.name | 現在ログインしているユーザー名を取得 |
principal | 現在の認証情報オブジェクト |
#argName | メソッドの引数を参照 |
returnObject | メソッドの戻り値を参照 |
@PreAuthorizeと@PostAuthorizeを使うべき場面
- リソースアクセスの制御: ログインユーザーが自身のデータにだけアクセスできるようにする。
- 動的な条件での認可: 戻り値を基に条件をチェックする必要がある場合に便利。
- 権限に応じたアクセス: 管理者や一般ユーザーなど、異なるロールごとに制御を行う場合。
まとめ
- @PreAuthorizeはメソッド実行前に条件をチェックするために使います。
- @PostAuthorizeはメソッド実行後に条件をチェックします。
- 認可処理が簡単に記述できるため、Webアプリケーションのセキュリティを強化できます。
@EnableGlobalMethodSecurity
を有効化することで、これらのアノテーションが使用可能になります。
もっと詳しく知りたい方は、Spring公式ドキュメントを見てみてくださいね。
他の記事が見たい方はこちら!↓↓↓