0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rails学習者向けのLaravelAdvent Calendar 2024

Day 16

Laravelのポリシーとガード:RailsのPunditとの比較

Last updated at Posted at 2024-12-15

はじめに

LaravelとRailsは、それぞれ人気のあるWebアプリケーションフレームワークであり、開発者に多くの便利なツールを提供しています。その中でも、アクセス制御の仕組みはアプリケーションのセキュリティを確保するために重要です。Laravelではポリシーとガードを利用し、RailsではPunditを使うことでアクセス制御を実現します。本記事では、Laravelのポリシーとガードの基本を解説し、RailsのPunditと比較しながら、その違いや利用シーンを見ていきます。

Laravelのポリシーとは?

ポリシーの基本

Laravelのポリシーは、特定のモデルに関連する認可ロジックをカプセル化するクラスです。ポリシーを利用することで、コントローラの中で煩雑になりがちな認可ロジックを整理することができます。

ポリシーの作成

ポリシーは、以下のコマンドで作成します:

php artisan make:policy PostPolicy --model=Post

このコマンドにより、app/Policies/PostPolicy.phpというファイルが生成されます。この中に各アクション(例: view, update, delete)に対応する認可ロジックを記述します。

ポリシーの登録

ポリシーを適用するには、AuthServiceProviderに登録する必要があります:

protected $policies = [
    \App\Models\Post::class => \App\Policies\PostPolicy::class,
];

ポリシーの利用

コントローラ内でポリシーを利用するには、authorizeメソッドを使用します:

public function update(Request $request, Post $post)
{
    $this->authorize('update', $post);
    // 更新処理
}

これにより、PostPolicyupdateメソッドが呼び出され、認可がチェックされます。

Laravelのガードとは?

ガードの基本

ガードは、Laravelにおける認証ドライバの設定です。例えば、アプリケーションに複数のユーザータイプ(管理者、一般ユーザーなど)が存在する場合に、それぞれの認証ロジックを定義できます。

ガードの設定

config/auth.phpファイル内でガードを設定します:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],

ガードの利用

現在のガードを切り替えるには、以下のように指定します:

Auth::guard('api')->check();

これにより、API用の認証が有効になります。

RailsのPunditとは?

Punditの基本

Punditは、Railsアプリケーションで利用される認可ライブラリです。Laravelのポリシーと同様に、モデルごとの認可ロジックを整理する役割を果たします。

Punditのインストール

Punditを使用するには、Gemfileに以下を追加します:

gem 'pundit'

その後、bundle installを実行します。

Punditのポリシー作成

ポリシーを生成するには、以下のコマンドを使用します:

rails g pundit:policy Post

これにより、app/policies/post_policy.rbが生成されます。

Punditの利用

コントローラ内でPunditを利用するには、以下のようにします:

def update
  @post = Post.find(params[:id])
  authorize @post
  # 更新処理
end

このコードは、PostPolicyupdateメソッドを呼び出します。

LaravelとRailsの比較

機能 Laravel Rails
認可ロジック ポリシーを利用 Punditを利用
認証管理 ガード(複数ガードが可能) Deviseや他のGemを利用可能
設定の柔軟性 高い(ガードを自由に定義可能) Gemやモジュールで拡張可能
コードの分離性 高い(認可ロジックを分離) 高い(ポリシーに分離)

まとめ

Laravelのポリシーとガードは、認可と認証の仕組みを柔軟かつ強力にサポートします。一方、RailsのPunditも認可ロジックの分離を可能にし、読みやすいコードを実現します。それぞれのフレームワークでの設計思想を理解し、適切に活用することで、セキュアなアプリケーションを効率的に構築できるようになるでしょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?