【Laravel6]ユーザー権限(ロール)を追加して、アクセス制限機能を実装する方法

Laravel

スポンサーリンク

LaravelのAuth認証機能を元にユーザー権限(ロール)を追加して、アクセス制限機能を実装する方法を解説します。

まずはUsersテーブルにrole列を追加します。

今回は0が管理者、1が会員とします。

[database/migrations/YYYY_MM_DD_000000_create_users_table.php]※一部抜粋

class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            //省略
            $table->integer('role')->default(1);
        });
    }

これでmigrationを行いましょう。

そして、Laravelの機能である、ゲート(Gate)を定義しましょう。

[app/Providers/AuthServiceProvider.php]※一部抜粋

class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->registerPolicies();

        // 管理者の場合にtrueを返す
        Gate::define('admin', function ($user) {
            return ($user->role == 0);
        });

これで管理者の権限ができました。

これの使い方は、

ルーティングに設定する場合

middleware('can:[Gateで定義した名前]’)で設定

[routes/web.php]

// Route::get('/home', 'HomeController@index')->name('home')
Route::get('/home', 'HomeController@index')->name('home')->middleware('can:admin');

コントローラーに設定する場合

コンストラクタに$this->middleware('can:[Gateで定義した名前]’)で設定

[app/Http/Controllers/HomeController.php]

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
        $this->middleware('can:admin');
    }

 

これで、権限のないユーザーでアクセスすると、以下のような403にリダイレクトされます。

Bladeテンプレートに設定する場合

このGateはBladeテンプレートでも使用することが可能です。

Bladeテンプレート内で以下のように記載すれば権限で表示を出しわけることができます。

@can('admin')
・・・adminでのみ表示・・・
@endcan

Laravel

Posted by ton