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

laravel-simple-roles

今回はLaravelGate(ゲート)を使わず権限(Roles)を付与する方法をご紹介します。
中小規模のシステムでは管理者が複数存在する場面は滅多にないし、同じ認証アカウントを使用することが多いので、わざわざデータベースに権限用のテーブルを追加してリレーションしたり、新たに管理者用のテーブルを追加するほどでもなく、結局追加しても管理権限を持つアカウントと、それ以外の数アカウントしか使わないのが目に見えている。

一般ユーザーと管理者の2択

先に断っておきますが、この方法は一般ユーザーはそのままで、少数の管理アカウントだけに権限を付与する方法です。

Laravelには面倒だが比較的簡単に実装できるMulti-Auth複数認証)や、WordPressのように権限ごとに細かく設定できるPolicy(ポリシー)を使った認可もありますが、今回はそれらを一切使わずに実装します。

つまり、Laravelの認証機能はそのままに、管理者アカウントだけに権限を付与する方法になります。

管理者アカウントを指定する

管理者にしたいアカウントメールアドレス)を設定ファイル.env)に書きます。

.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  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

protected $routeMiddleware = [
    ...
    'admin' => App\Http\Middleware\CheckAdmin::class,
];

ルートに追加

ルートmiddlewareadminを追加し、管理者権限でしかアクセスできない領域を作成します。

/routes/web.php

Route::group(['middleware' => ['auth', 'admin']], function () {
    Route::resource('admin/post', 'AdminPostController');
});

この記事のようにnamespaceで一般会員サイトと管理画面を分けても良いかも。

Configで設定する方法

上記では、権限を付与したいアカウント.envファイルで設定しましたが、configディレクトリのファイルに追加しちゃってもいいです。

/config/app.php

app.phpLaravelにデフォルトで用意されているファイルです。
[admin_roles]配列の中に追加します。

...
'admin_roles' => [
    admin@sampledomain.com,
    example@sampledomain.com,
],
...

先程のミドルウェアの部分も少し変更して、config()を使って取得します。

$admin_roles = explode(',', config('app.admin_roles'));

この方がメールアドレスがちょっと多くなっても権限を管理しやすいですね。

設定(Config)ファイルを追加

上記では、Laravelに初めから用意されていたファイルに追記しましたが、権限だけをべ別ファイルで管理したい場合は、configディレクトリの中に権限管理専用の新規ファイルを作成します。

/config/admin.php

新しく/config/admin.phpというファイルを作成したとします。
以下のように、権限を付与するメールアドレスの連想配列を返します。

<?php
return [
    'roles' => [
        admin@sampledomain.com,
        example@sampledomain.com,
    ],
];

ミドルウェアでは、[ファイル名]+[連想配列のキー]と言った感じで取得します。

$admin_roles = explode(',', config('admin.roles'));

ソースを綺麗に保つために、できるだけLaravel既存のファイルを触りたくないので、私はこちらの方法を採用します。


Amazonベストセラー

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA