Laravel:roleによってユーザー一覧を可変させる

Laravel:roleによってユーザー一覧を可変させる

管理者による新規ユーザー作成関連として、前回までの記事で下記構成を構築しました。

今回はユーザー一覧を作ります。

ユーザー一覧で欲しい動作

今回のシステムでは、roleの分類を以下の4タイプに分けています。
※後に詳細な設定をする可能性を考えroleの値に幅を持たせています。

権限タイプ ロール値 Gate名
メンテナンス用 1 Engineer
管理者 2 ~ 5 admin
一般ユーザー 6 ~ 8 user
外注利用 9 ~10 outsourcing

その為、権限タイプごとに動作の可否を考えています。

  1. メンテナンス用権限は、テーブルusersの全ての情報に対して【閲覧/新規追加/編集/削除】が出来る
  2. 管理者用権限は、メンテナンス用権限を除くテーブルusersの情報に対して【閲覧/新規追加/編集/削除】が出来る
  3. 一般ユーザー権限は、メンテナンス用権限を除くテーブルusersの情報に対して【閲覧】出来る。また、自分の情報に対して【編集】が出来る。
  4. 外注利用権限は、自分の情報に対して【閲覧/編集】が出来る。自分以外の情報に対してすべての操作が許可されない。

ログインパスワードについてはハッシュ化している為、閲覧できたとしても意味を成しません。その為、編集できる権限にて再設定できる状態として構築します。

利用するControllerとModel

今回はModel:User (\app\User.php)をそのまま利用しようと思います。その為、コントローラーはUserControllerを新設します。

■SSH

php artisan make:controller UserController --resouce

UserControllerのインデックス

roleの値によって取得する情報をコントロールします。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\DB;
use App\User;

class UserController extends Controller
{
    public function index()
    {
        $role = \Auth::user()->role;
        $id = \Auth::user()->id;
        if($role === 1) //メンテナンス用権限
            {
            $items = User::all();
            $delete_flag = 1;
            }
        elseif(($role > 1)&&($role <= 5)) //管理者権限
            {
            $items = User::where('role' ,'>=',2)->get();
            $delete_flag = 1;
            }
        elseif(($role > 5)&&($role <= 8)) //一般ユーザー権限
            {
            $items = User::where('role','>=',2)->get();
            $delete_flag = 0;
            }
        else //外注権限
            {
            $items = User::where('id','=',$id)->get();
            $delete_flag = 0;
            }
        return view('users.index', compact('items','delete_flag','role'));
    }

...........
}

$role = \Auth::user()->role; でログインユーザーのrole値を取得しています。
この取得した$roleをif関数で場合分けします。

メンテナンス用権限の場合は全てを取得し、管理権限/一般ユーザー権限の場合はメンテナンス用権限を除くusersテーブルの情報を取得しています。

外注権限の場合は自分と同じIDの値のみを取得させています。
$delete_flag は削除権限を与えるか否かのFlagです。ビュワーにて設定をするため値をViewに渡します。

View:users\index.blade.phpの設定

@section('content')
    @if($delete_flag === 1)
        @can('admin')
            <table id='list'>
                <tr>
                    <th>名前</th>
                    <th>メールアドレス</th>
                    <th>作成日</th>
                    <th>更新日</th>
                </tr>
                @foreach ($items as $item)
                    <tr>
                        <td data-href="/users/{{$item->id}}/edit">{{ $item->name }}</td>
                        <td style='font-size:small;'>
                            <a href='mailto:{{$item->email}}?subject=連絡事項'>
                                {{ $item->email }}
                            </a>
                        </td>
                        <td >{{ $item->created_at->format('Y_m_d') }}</td>
                        <td data-href="/users/{{$item->id}}/edit">{{ $item->updated_at->format('Y_m_d') }}</td>
                        <td>
                            @if($role <= ($item->role))
                            <form action="/users/{{$item->id}}" method='post'>
                                {{ csrf_field() }}
                                {{ method_field('DELETE') }}
                                <button type="submit" style="width:100%;">削除</button>
                            </form>
                            @endif
                        </td>
                    </tr>
                @endforeach
            </table>
        @endcan
    @else
        @can('outsourceing')
            <table id='list'>
                <tr>
                    <th>名前</th>
                    <th>メールアドレス</th>
                    <th>作成日</th>
                    <th>更新日</th>
                </tr>
                @foreach ($items as $item)
                    <tr>
                        <td>{{ $item->name }}</td>
                        <td style='font-size:small;'>
                            <a href='mailto:{{$item->email}}?subject=連絡事項'>
                                {{ $item->email }}
                            </a>
                        </td>
                        <td>{{ $item->created_at->format('Y_m_d') }}</td>
                        <td>{{ $item->updated_at->format('Y_m_d') }}</td>
                        <td>
                            @if((Auth::user()->id) == ($item->id))
                                <input type="button" value="編集" onclick="location.href='/users/{{$item->id}}/edit'">
                            @endif
                        </td>
                    </tr>
                @endforeach
            </table>
        @endcan
    @endif
@endsection

コントローラーで $delete_flag = 1 として管理者権限以上の role (メンテナンス権限/管理者権限)では削除ボタンを含めたテーブルタグが作成されます

一方で、$delete_flag = 0 とした一般ユーザー以下(一般ユーザー権限/外注権限)では削除ボタンを編集ボタンに変えたテーブルタグが作成されます。変数ボタンは自分と同じユーザーIDの値にのみ表示しその他の値には表示されません。

更新などは定型でOK

edit.blade.php 等は特に工夫を凝らさなくてもサクサクと作成していけます。

直接URLにID打ち込まれた場合の回避を考える場合はコントローラーで多少の細工は必要かもしれません。

まとめ

動作を細かくしようとすればするほど条件分岐は面倒になっていきます。

場合によっては、削除を許可する場合はusers.blade.phpへ、削除を許可しない場合はaccounts.bade.phpへ飛ばすなど導線そのものを分けてしまった方が管理しやすいかもしれません。

 

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。