Laravelには制限をかける方法は色々ありますが、最も手っ取り早いのはGateを使う方法。
今回は GateとuserHasRole関数を設定して、役割ごとに表示やアクセス制限をかける方法を解説します。
アクセス制限が適切にされているかどうかで、サイトの信頼度は180度変わってきます。
しっかり制限をかけて、サイトの信頼性を上げていきましょう。
Gate=門です。
許可がある人にだけ門が開かれるってイメージですね。
LaravelでGateでアクセス制限をかける方法【Laravel入門講座】
手順は次のとおり。
- UserモデルでuserHasRole関数を設定する
- Gateを設定する
- ルート設定にアクセス制限をかける
- ビューファイルに表示設定をかける
なお、最初にRole(役割)モデルを作り、Userモデルとリレーションをはっておく必要があります。
この部分については、別記事で解説しているので、参考にしてください。
今回はすでに、次のようなRoleテーブルがあるとします。
adminが管理者で、userが通常のユーザーです。
UserとRoleは belongToManyリレーションでつながっており、次の中間テーブルがあるとします。
UserモデルでuserHasRole関数を設定する
まず、Userファイルを開き、次のようにuserHasRole関数を設定します。
1 2 3 4 5 6 7 |
public function userHasRole($role_name){ foreach($this->roles as $role){ if($role_name==$role->name){ return true; } return false; } |
Gateを設定する
app/Providersの中のAuthServiceProvider.phpを開きます。
上部に次のuse宣言を入れておきます。
1 |
use App\Models\User; |
そのうえで、次のようにisAdminゲートを設定します。
1 2 3 |
Gate::define('isAdmin', function($user){ return $user->userHasRole('admin'); }); |
先ほどのuserHasRole関数を使い、ユーザーがadminかどうかで制限をかけるようにしました。
もしadmin以外の役割を使って制限をかけたいなら、役割名は、適宜変更してください。
ルート設定にアクセス制限をかける
これで設定は終わり。
設定した制限をかけたいルート設定には、次のように ->middleware('can:isAdmin') 入れます。
1 |
Route::get('/profile/edit/{user}', 'ProfileController@edit')->middleware('can:isAdmin'); |
管理者ではない人がアクセスしようとすると、次のようになります。
ビューファイルに表示設定をかける
ビューファイルにも制限をかけられます。
たとえば管理者だけにボタンが表示されるようにするには、blade.phpファイルに次のようにisAdminゲートを挿入します。
1 2 3 |
@can('isAdmin') <button class="btn btn-primary">ボタン</button> @endcan |
※ちなみに、userHasRole関数だけでも、可能だったりはします。
その場合、次のように書きます。
1 2 3 |
@if(auth()->user()->userHasRole('admin')) <button class="btn btn-primary">ボタン</button> @endif |
コントローラーに制限をかける
最後にコントローラーに制限をかける方法を紹介します。
制限をかけたいコントローラーファイルの上に、下記のuse宣言をいれておきます。
1 |
use Gate; |
isAdminゲートを入れたい部分には、次のようにします。
1 2 3 |
if(Gate::authorize('isAdmin')){ return view('profile.edit'); } |
これで、profile.editページはadminユーザーしかアクセスできなくなりました。
他のユーザーがアクセスしようとすると、また403 unauthorized画面が出てきます。
なおGateを使って【アクセスできる】方法を説明しましたが、Gateで【アクセスできなくする】ことも可能です。
その場合には、Gate::deniesを使います。
denyは否定するという意味で、deniesは三人称単数形ですね。
adminはprofile.editページにできないようにするには、次のように書きます。
1 2 3 4 5 |
if(Gate::denies('isAdmin')){ return view('profile.edit', compact('user', 'roles')); }else { abort(404); } |
aminがprofile.editページを開こうとすると、404 not found が表示されます。
さいごに
Gateを使って、ルート設定・ビューファイル・コントローラーに制限をかける方法を紹介しました。
アクセス制限は地味ながら、使いやすく、安心できるサイトに不可欠な機能。
そしてLaravelでは、色々な制限が可能です。
関連記事でも解説しているので、他の方法もチェックしてみてくださいね。