Laravel 5.5で超簡単かつシンプルに権限(Roles)を付与する方法

中小規模のシステムでは管理者が複数存在する場面は滅多にない。
あったとしても、同じ認証アカウントを使用することが多いので、わざわざデータベースに権限用のテーブルを追加してリレーションしたり、新たに管理者用のテーブルを追加するほどでもなく、結局追加しても数アカウントしか使わないのが目に見えている。
一般ユーザーと管理者の2択
先に断っておきますが、この方法は一般ユーザーはそのままで、少数の管理アカウントだけに権限を付与する方法です。
Laravelには面倒だが比較的簡単に実装できるMulti-Auth(複数認証)や、WordPressのように権限ごとに細かく設定できるPolicy(ポリシー)を使った認可もありますが、今回はそれらを一切使わずに実装します。
アカウントを指定する
管理者用のアカウント(メールアドレス)を設定ファイルに書きます。
.env
カンマ区切りで複数指定します。
ADMIN_ROLES=admin@sampledomain.com,example@sampledomain.com
ミドルウェアを追加
auth同様に、ルートやコントローラーに追加したいので、ミドルウェアを作成します。
app\Http\Middleware\ChackAdmin.php
<?php
namespace App\Http\Middleware;
use Closure;
class CheckAdmin
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $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
protected $routeMiddleware = [
...
'admin' => \App\Http\Middleware\CheckAdmin::class,
];
ルートに追加
middlewareにadminを追加してあげれば完成です。
routes\web.php
Route::group(['middleware' => ['auth', 'admin']], function () {
Route::resource('admin/post', 'Admin\PostController');
});
この記事のようにnamespaceで一般会員サイトと管理画面を分けても良いかも。
AppzCoderさんがGithubで提供しているLaravelパッケージの1つに「Laravel Admin Panel」というものがあります。 GitHub - appzcoder/laravel-admin: Laravel Admin Panel一見、ロール(役割)付きの管理画面を提供しているのかと思ったら、同じくAppzCoderさんのLara... Laravel 5.5に対応したCRUD Generator付きの管理画面(Admin)を試してみる - Minory |
Configで設定する方法
上記では.env
ファイルで設定しましたが、config
ディレクトリのファイルに追加しちゃってもいいです。
app.phpに追加
app.php
はLaravelに初めから用意されているファイルです。
配列の中に追加します。
config\app.php
...
'admin_roles' => [
admin@sampledomain.com,
example@sampledomain.com,
],
...
ミドルウェアでは、config()
を使って取得します。
$admin_roles = explode(',', config('app.admin_roles'));
この方がメールアドレスがちょっと多くなっても管理しやすいですね。
設定(Config)ファイルを追加
config\admin.php
というファイルを作成したとします。
config\app.php
<?php
return [
'roles' => [
admin@sampledomain.com,
example@sampledomain.com,
],
];
ミドルウェアではこのように取得します。
$admin_roles = explode(',', config('admin.roles'));
ソースを綺麗に保つために、できるだけLaravel既存のファイルを触りたくないので、私はこちらの方法を採用します。
コメント
コメントを投稿