ごみばこ

プログラムに関する備忘録などを書いています。

Laravelで権限を追加する(同一テーブルの場合)

ログインユーザーに権限を付与して処理を制御したい場合。
ログインに使用するテーブルはデフォルトのusersです。
権限を管理するカラムを追加して下さい。

上記が完了したら、Userモデルに少し追記します。

<?php

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{

  const ADMIN = 1;

  /**
  * The attributes that are mass assignable.
  * roleを追加しています。
  * @var array
  */
  protected $fillable = [
    'name', 'email', 'password', 'role',
  ];

  /**
  * The attributes excluded from the model's JSON form.
  *
  * @var array
  */
  protected $hidden = [
    'password', 'remember_token',
  ];

  /**
   * 管理者権限か判定します。
   * @return boolean true->管理者
   */
  public function isAdmin(){
    return $this->role_id === User::ADMIN;
  }

}

次にミドルウェアを追加します。

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;
use App\User;

class AdminMiddleware
{
  /**
  * Handle an incoming request.
  *
  * @param  \Illuminate\Http\Request  $request
  * @param  \Closure  $next
  * @return mixed
  */
  public function handle($request, Closure $next)
  {
    // ログイン中のユーザーが管理者権限ならリクエスト実行
    if(Auth::check() && Auth::user()->isAdmin())
    {
      return $next($request);
    }
    
    // アクセス拒否のページへリダイレクト
    return redirect('/denied');
  }
}

最後にKernel.phpの$routeMiddlewareに追記します。

<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;
use \Middleware\AdminMiddleware;

class Kernel extends HttpKernel
{
    // 省略…

    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'admin' => \App\Http\Middleware\AdminMiddleware::class,    // 追加箇所
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    ];
}

これでmiddleware(‘admin’)と書けば、管理者とゲストで分割出来ると思います。