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


laravel-simple-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,
];

ルートに追加

middlewareadminを追加してあげれば完成です。

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.phpLaravelに初めから用意されているファイルです。
配列の中に追加します。

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既存のファイルを触りたくないので、私はこちらの方法を採用します。


コメント

このブログの人気の投稿

Linuxでファイルの改行コードLF⇔CRLFを変換する方法

RHEL 7でスタティック(静的)ルートを追加する4つの方法

UTF-8のBOM付きとBOMなしを変換する方法(Linux)