LaravelでGate機能を使ってユーザ情報に権限情報を追加します。
ユーザ毎に管理者権限などを割り振りたい場合、Laravelに用意されているGate機能を利用すると便利です。
具体的にはユーザ毎に任意の数字を割り振り、その数字により権限を割り振ることにしたいのですが、デフォルトのuserテーブルにはそのカラムが存在しません。そこでカラムを追加するところから権限機能追加の手順について確認していきます。
ちなみに今回の環境はLaravel 5.8で、Auth機能は追加済みを想定しています。
また、追加したカラムの持つ数字の意味として、以下の権限を付与するものとします。
1 : 閲覧者
50 : 編集者
100 : 管理者
システム設計として、数字を連番にしてしまうと、いざ間に新しい権限を追加しようとしたときに困るので、数字の間に余裕を持たせるのが一般的です。
userテーブルに権限情報を追加する
userテーブルに権限情報カラム「role」を追加します。カラム追加にはmigrateファイルを作成します。
> php artisan make:migration add_column_to_users_table
ファイル「…/database/migrations/2020_08_15_150000_add_column_to_users_table.php」が作成されるので、編集して以下のように記述します。
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class AddColumnToUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->integer('role')->default(1);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('role');
});
}
}
migrateを実行します。
> php artisan migrate
userテーブルにカラム「role」が追加されてる事が確認できます。
Gate機能で権限設定
Gate機能を使って権限を設定します。
設定は、ファイル「…/app/Providers/AuthServiceProvider.php」に記述します。関数bootを編集して、Gateクラスを利用して各権限設定を記述します。
public function boot()
{
$this->registerPolicies();
// 管理者
Gate::define('admin', function ($user) {
return ($user->role == 100);
});
// 編集者
Gate::define('edit', function ($user) {
return ($user->role >= 50);
});
// 閲覧者
Gate::define('read', function ($user) {
return ($user->role > 0);
});
}
以上で設定完了です。
以降、実際にこの権限設定を利用して、ユーザ毎に処理を分けてみます。
権限毎にアクセスできるページを判定する
権限毎にアクセスできるページを設定する場合は「…/routes/web.php」で制御することができます。
例えば「http://helog.jp/admin」には管理者しかアクセスできないようにするためには、以下のように記述します。
Route::group(['middleware' => ['auth', 'can:admin']], function () {
Route::get('/admin', 'AdminController@index');
});
実際に管理者としてログインした状態で、上記ページにアクセスすると、ページを表示することができます。
但し、編集者や閲覧者、または、ログインしていないユーザがアクセスすると、403ページへとリダイレクトされます。
コントローラ内で権限毎に処理を分ける
Gateクラスの関数allows、deniesを使って権限毎に処理を分ける事ができます。Gateクラスは「Illuminate\Support\Facades\Gate」で読み込みます。
if(Gate::allows('admin')){
// 管理者だけ処理を実行します
}
if(Gate::denies('read')){
// 閲覧者を除いて処理を実行します
}
Bladeで権限毎に表示内容を出し分ける
ページ内で、権限毎に表示する情報を出し分ける方法です。こちらはBladeテンプレートエンジンを利用して、以下のように実装できます。
@can('admin')
<p>あなたは管理者です</p>
@elsecan('edit')
<p>あなたは編集者です</p>
@elsecan('read')
<p>あなたは閲覧者です</p>
@else
<p>あなたに権限はありません</p>
@endcan
コメントする