今回はLaravelでGate(ゲート)を使わずに権限(Roles)を付与する方法をご紹介します。
中小規模のシステムでは管理者が複数存在する場面は滅多にないし、同じ認証アカウントを使用することが多いので、わざわざデータベースに権限用のテーブルを追加してリレーションしたり、新たに管理者用のテーブルを追加するほどでもなく、結局追加しても管理権限を持つアカウントと、それ以外の数アカウントしか使わないのが目に見えている。
一般ユーザーと管理者の2択
先に断っておきますが、この方法は一般ユーザーはそのままで、少数の管理アカウントだけに権限を付与する方法です。
Laravelには面倒だが比較的簡単に実装できるMulti-Auth(複数認証)や、WordPressのように権限ごとに細かく設定できるPolicy(ポリシー)を使った認可もありますが、今回はそれらを一切使わずに実装します。
つまり、Laravelの認証機能はそのままに、管理者アカウントだけに権限を付与する方法になります。
管理者アカウントを指定する
管理者にしたいアカウント(メールアドレス)を設定ファイル(.env)に書きます。
.env
以下のように、権限を付与したいメールアドレスをカンマ区切りで複数指定します。
1 |
ADMIN_ROLES=admin@sampledomain.com,example@sampledomain.com |
ミドルウェアを追加
auth同様に、ルートやコントローラーで表示するページやデータを制御したいので、権限チェック用のミドルウェアを作成します。
/app/Http/Middleware/ChackAdmin.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?php namespace App\Http\Middleware; use Closure; class CheckAdmin { /** * Handle an incoming request. * * @param IlluminateHttpRequest $request * @param Closure $next * @return mixed */ public function handle($request, Closure $next) { $admin_roles = explode(',', env('ADMIN_ROLES')); if (!in_array(auth()->user()->email, $admin_roles)) { return redirect('/home'); } return $next($request); } } |
作成したミドルウェアをKernel.phpに登録します。
/app/Http/Middleware/Kernel.php
1 2 3 4 |
protected $routeMiddleware = [ ... 'admin' => App\Http\Middleware\CheckAdmin::class, ]; |
ルートに追加
ルートのmiddlewareにadminを追加し、管理者権限でしかアクセスできない領域を作成します。
/routes/web.php
1 2 3 |
Route::group(['middleware' => ['auth', 'admin']], function () { Route::resource('admin/post', 'AdminPostController'); }); |
この記事のようにnamespaceで一般会員サイトと管理画面を分けても良いかも。
Configで設定する方法
上記では、権限を付与したいアカウントを.envファイルで設定しましたが、configディレクトリのファイルに追加しちゃってもいいです。
/config/app.php
app.phpはLaravelにデフォルトで用意されているファイルです。
[admin_roles]配列の中に追加します。
1 2 3 4 5 6 |
... 'admin_roles' => [ admin@sampledomain.com, example@sampledomain.com, ], ... |
先程のミドルウェアの部分も少し変更して、config()を使って取得します。
1 |
$admin_roles = explode(',', config('app.admin_roles')); |
この方がメールアドレスがちょっと多くなっても権限を管理しやすいですね。
設定(Config)ファイルを追加
上記では、Laravelに初めから用意されていたファイルに追記しましたが、権限だけをべ別ファイルで管理したい場合は、configディレクトリの中に権限管理専用の新規ファイルを作成します。
/config/admin.php
新しく/config/admin.phpというファイルを作成したとします。
以下のように、権限を付与するメールアドレスの連想配列を返します。
1 2 3 4 5 6 7 |
<?php return [ 'roles' => [ admin@sampledomain.com, example@sampledomain.com, ], ]; |
ミドルウェアでは、[ファイル名]+[連想配列のキー]と言った感じで取得します。
1 |
$admin_roles = explode(',', config('admin.roles')); |
ソースを綺麗に保つために、できるだけLaravel既存のファイルを触りたくないので、私はこちらの方法を採用します。
コメント