@PostAuthorizeと@PreAuthorizeって?【初心者向け】

こんにちは!
今回は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公式ドキュメントを見てみてくださいね。

他の記事が見たい方はこちら!↓↓↓

タイトルとURLをコピーしました