JetStreamのTeam機能は、基本的な構造は提供してくれますが、そのまま使用するには物足りません。そこで、使いやすいようにカスタマイズしてみたいと思います。
Team機能とは
JetStreamのチーム機能は、Laravelのアプリケーションにおいてユーザーがチームを作成し、他のユーザーをチームに招待したり、役割や権限を管理するための強力な機能です。JetStreamはLaravel 8から導入されたアプリケーションスターターキットで、LivewireやInertia.jsを用いたフロントエンド実装をサポートしています。
JetStream チーム機能の主な特徴
- チームの作成と管理: ユーザーは自分のチームを作成し、管理することができます。これには、チーム名の設定や、チームの詳細情報の編集などが含まれます。
- メンバーの招待と削除: チームオーナーは、他のユーザーを自分のチームに招待したり、チームから削除することができます。
- 役割と権限: JetStreamは、チーム内の各メンバーに異なる役割や権限を割り当てることが可能です。これにより、チーム内でのユーザーの活動範囲を細かく制御できます。
- 柔軟な設定: JetStreamのチーム機能はカスタマイズ可能で、アプリケーションのニーズに応じて様々な設定を行うことができます。
- インターフェースの統合: JetStreamは、チーム機能に関するインターフェースを提供し、ユーザーが直感的に操作できるようになっています。
使用方法
- JetStreamのインストール: LaravelプロジェクトにJetStreamをインストールします。
- チーム機能の有効化: JetStreamの設定でチーム機能を有効にします。
- ルーティングとコントローラ: 必要に応じて、チーム関連のルーティングやコントローラを設定します。
- ビューのカスタマイズ: チーム管理に関連するビューをカスタマイズし、ユーザーインターフェースを整えます。
- テストとデプロイ: チーム機能が正しく動作するかテストし、問題がなければアプリケーションをデプロイします。
ロールのカスタマイズ
デフォルトのロール
JetStreamのTeam機能には、予めadminとeditorの2種類のロールがあります。
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.」という説明が与えられており、エディターが読み取り、作成、更新のアクションを実行できることを意味しています。
ロールの追加
下記のように修正してみました。
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('ユーザーは、チームのコンテンツを閲覧できます。');
ブラウザで確認
ブラウザで確認したら、下記のようになっていました。
TeamPolocyのカスタマイズ
権限の設定
ロールは作っても権限を設定しないと実際には、動作しません。以下に設定方法を記載します。
そしてTeamPolicyの各メソッドを下記のように修正します。
<?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’ パーミッションを持つユーザーのみにします。
- 51〜76行目:チームのメンバーに関する処理(追加、修正、削除)は、デフォルトでは、チームのオーナーのみの特権でしたが、adminロールのユーザーもメンバー処理をできるように修正しました。
コメント