Laravel 5.2 の認可の機能を使ってログインユーザーの権限を調べてアクセス制限をしようとしています。
ビューコントローラーのコンストラクタで次のようにしてミドルウェアを使っています。
PHP
1public function __construct() 2{ 3 $this->middleware('auth:admins'); 4 $this->middleware('can:edit-config'); 5}
can で edit-config などの動作を渡し、権限があれば利用できるようにします。
ユーザーは $user->isSuperadmin を調べることで特権管理者かどうかを調べることができ、
特権管理者であればすべての動作が許可されています。
AuthServiceProvider クラスで before を定義しました。
PHP
1 public function boot(GateContract $gate) 2 { 3 $this->registerPolicies($gate); 4 5 $gate->before(function ($user, $ability) { 6 if ($user->isSuperadmin) { 7 return true; 8 } 9 }); 10 11 $abilities = Ability::all(); 12 13 foreach($abilities as $ability){ 14 Gate::define($ability->action, function ($user) use ($ability) { 15 return $user->hasAbility($ability->action); 16 }); 17 } 18 }
このように作ったのですが、特権管理者や権限を持つユーザーであっても 403 エラーで禁止されてしまいます。チェックしてみると before() や define() のコールバック自体が実行されていないようでした。boot() 自体は実行されていました。
ただし、次のようにした場合は正常に判定が行われています。
PHP
1Auth::guard('admins')->user()->can('edit-config'); // true
ユーザーは users と admins の2つの guard があります。
middlewareに対してもログインしているユーザーのオブジェクトを渡す必要がある用に見えますが手順がよくわかっていません。
どのようにすれば正しく動作するのでしょうか?
あなたの回答
tips
プレビュー