JetStreamのTeam機能をカスタマイズ

JetStreamのTeam機能は、基本的な構造は提供してくれますが、そのまま使用するには物足りません。そこで、使いやすいようにカスタマイズしてみたいと思います。

目次

Team機能とは

JetStreamのチーム機能は、Laravelのアプリケーションにおいてユーザーがチームを作成し、他のユーザーをチームに招待したり、役割や権限を管理するための強力な機能です。JetStreamはLaravel 8から導入されたアプリケーションスターターキットで、LivewireやInertia.jsを用いたフロントエンド実装をサポートしています。

STEP

JetStream チーム機能の主な特徴

  1. チームの作成と管理: ユーザーは自分のチームを作成し、管理することができます。これには、チーム名の設定や、チームの詳細情報の編集などが含まれます。
  2. メンバーの招待と削除: チームオーナーは、他のユーザーを自分のチームに招待したり、チームから削除することができます。
  3. 役割と権限: JetStreamは、チーム内の各メンバーに異なる役割や権限を割り当てることが可能です。これにより、チーム内でのユーザーの活動範囲を細かく制御できます。
  4. 柔軟な設定: JetStreamのチーム機能はカスタマイズ可能で、アプリケーションのニーズに応じて様々な設定を行うことができます。
  5. インターフェースの統合: JetStreamは、チーム機能に関するインターフェースを提供し、ユーザーが直感的に操作できるようになっています。
STEP

使用方法

  1. JetStreamのインストール: LaravelプロジェクトにJetStreamをインストールします。
  2. チーム機能の有効化: JetStreamの設定でチーム機能を有効にします。
  3. ルーティングとコントローラ: 必要に応じて、チーム関連のルーティングやコントローラを設定します。
  4. ビューのカスタマイズ: チーム管理に関連するビューをカスタマイズし、ユーザーインターフェースを整えます。
  5. テストとデプロイ: チーム機能が正しく動作するかテストし、問題がなければアプリケーションをデプロイします。

ロールのカスタマイズ

STEP

デフォルトのロール

JetStreamのTeam機能には、予めadminとeditorの2種類のロールがあります。

app/Providers/JetstreamServiceProvider.php
protected function configurePermissions(): void
{
    Jetstream::defaultApiTokenPermissions(['read']);

    Jetstream::role('admin', 'Administrator', [
        'create',
        'read',
        'update',
        'delete',
    ])->description('Administrator users can perform any action.');

    Jetstream::role('editor', 'Editor', [
        'read',
        'create',
        'update',
    ])->description('Editor users have the ability to read, create, and update.');
}

いかに、configurePermissionsメソッドの説明を記述しておきます。

APIトークンのデフォルト権限設定

3行め:APIトークンが作成された際のデフォルトの権限を設定します。ここでは、新しいAPIトークンにデフォルトで「読み取り」権限 ( read ) が与えられるように設定しています。つまり、特別な権限を指定しない限り、APIトークンを使用して行える操作は読み取りのみに限られます。

Adminロール

5〜10行目:「admin」ロールは、「Administrator」という名前で、以下の権限を持っています。

  • create : 新しいリソースを作成する権限。
  • read : 既存のリソースを読み取る権限。
  • update : 既存のリソースを更新する権限。
  • delete : リソースを削除する権限。

このロールは「Administrator users can perform any action.」という説明が与えられており、管理者が任意のアクションを実行できることを意味しています。

Editorロール

「editor」ロールは、「Editor」という名前で、以下の権限を持っています。

  • read : 既存のリソースを読み取る権限。
  • create : 新しいリソースを作成する権限。
  • update : 既存のリソースを更新する権限。

このロールは「Editor users have the ability to read, create, and update.」という説明が与えられており、エディターが読み取り、作成、更新のアクションを実行できることを意味しています。

STEP

ロールの追加

下記のように修正してみました。

Jetstream::role('admin', 'チーム管理者', [
  'create',
  'read',
  'update',
  'delete',
  'addTeamMember',
  'updateTeamMember',
  'removeTeamMember',
])->description('チーム管理者は、チームメンバーを招待したり、チーム設定を変更したりできます。');

Jetstream::role('manager', 'マネージャー', [
  'create',
  'read',
  'update',
  'delete',
])->description('マネージャーは、チーム設定を変更したりできます。');

Jetstream::role('editor', '編集者', [
  'read',
  'update',
])->description('編集者は、チームのコンテンツを作成したり、更新したりできます。');

Jetstream::role('user', 'ユーザー', [
  'read',
])->description('ユーザーは、チームのコンテンツを閲覧できます。');
STEP

ブラウザで確認

ブラウザで確認したら、下記のようになっていました。

TeamPolocyのカスタマイズ

STEP

権限の設定

ロールは作っても権限を設定しないと実際には、動作しません。以下に設定方法を記載します。

そしてTeamPolicyの各メソッドを下記のように修正します。

app/policies/TeamPolicy.php
<?php

namespace App\Policies;

use App\Models\Team;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class TeamPolicy
{
    use HandlesAuthorization;

    /**
     * 全てのユーザーがチームを表示できる
     */
    public function viewAny(User $user): bool
    {
        return true;
    }

    /**
     * ユーザーがそのチームのメンバーであれば表示を許可
     */
    public function view(User $user, Team $team): bool
    {
        return $user->belongsToTeam($team);
    }

    /**
     * デフォルトでは、全員がチームを作成できるようになっているが
     * チームを作成できるのは 'createTeam' パーミッションを持つユーザーのみにする
     */
    public function create(User $user): bool
    {
        // return true;
        return $user->hasPermissionTo('createTeam');
    }

    /**
     * チームのオーナーのみがチームを更新できる
     */
    public function update(User $user, Team $team): bool
    {
        return $user->ownsTeam($team);
    }

    /**
     * デフォルトでは、チームのオーナーのみがチームメンバーを追加できるが
     * オーナーと、'addTeamMember' パーミッションを持っているユーザーが、チームメンバーを追加できる
     */
    public function addTeamMember(User $user, Team $team): bool
    {
        // return $user->ownsTeam($team);
        // ユーザーがチームのオーナーであるか、'addTeamMember' パーミッションを持っているかをチェック
        return $user->ownsTeam($team) || $user->hasTeamPermission($team, 'addTeamMember');
    }

    /**
     * デフォルトでは、チームのオーナーのみがチームメンバーを更新できるが
     * オーナーと、'updateTeamMember' パーミッションを持っているユーザーが、チームメンバーを更新できる
     */
    public function updateTeamMember(User $user, Team $team): bool
    {
        // ユーザーがチームのオーナーであるか、'updateTeamMember' パーミッションを持っているかをチェック
        return $user->ownsTeam($team) || $user->hasTeamPermission($team, 'updateTeamMember');
    }

    /**
     * デフォルトでは、チームのオーナーのみがチームメンバーを削除できるが
     * オーナーと、'removeTeamMember' パーミッションを持っているユーザーが、チームメンバーを削除できる
     */
    public function removeTeamMember(User $user, Team $team): bool
    {
        // ユーザーがチームのオーナーであるか、'removeTeamMember' パーミッションを持っているかをチェック
        return $user->ownsTeam($team) || $user->hasTeamPermission($team, 'removeTeamMember');
    }

    /**
     * チームのオーナーのみがチームを削除できる
     */
    public function delete(User $user, Team $team): bool
    {
        return $user->ownsTeam($team);
    }
}
  • 33〜37行目:デフォルトでは、全員がチームを作成できるようになっていますが、ここでは、チームを作成できるのは ‘createTeam’ パーミッションを持つユーザーのみにします。

尚、この設定はLaravel-permissionでcreateTeamパーミッションが事前に作成されていないとエラーになりますので、注意してください。

  • 51〜76行目:チームのメンバーに関する処理(追加、修正、削除)は、デフォルトでは、チームのオーナーのみの特権でしたが、adminロールのユーザーもメンバー処理をできるように修正しました。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次