LaravelのPolicy処理が呼び出されず、認証制御ができない
期待値としてはPolicyでfalseを返しているためアクセス拒否となってほしい所ですが、普通に画面が表示されてしまいます。
該当のソースコードサンプル
・Laravel AuthServiceProvider
use Illuminate\Support\Facades\Gate; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use App\Models\Admin\Hoge; use App\Policies\HogePolicy; class AuthServiceProvider extends ServiceProvider { protected $policies = [ Hoge::class => HogePolicy::class ]; public function boot() { $this->registerPolicies(); } }
・Laravel Controller
public function edit($id) { // $hoge= $this->Hoge->find($id); // Hogeモデルの検索結果取得OK $hoge= (new Hoge)::find($id); // ↑と結果は同じ $this->authorize('edit', $hoge); // dd(policy(Hoge::class)); // 「^ App\Policies\HogePolicy {#724}」と表示されるのでAuthServiceProviderの設定は上手くいっている? }
・Laravel HogePolicy(一部)
<?php namespace App\Policies; use App\Models\Admin\Hoge; use App\Models\Admin\User; use Illuminate\Auth\Access\HandlesAuthorization; class HogePolicy { use HandlesAuthorization; /** * Determine whether the user can view any hoges. * * @param \App\Models\Admin\User $user * @return mixed */ public function viewAny(User $user) { // } /** * Determine whether the user can view the hoge. * * @param \App\Models\Admin\User $user * @param \App\Hoge $hoge * @return mixed */ public function view(User $user, Hoge $hoge) { \Log::debug('-------------------- call view policy --------------------'); return false; } public function edit(User $user, Hoge $hoge) { \Log::debug('-------------------- call edit policy --------------------'); return false; } /** * Determine whether the user can create hoges. * * @param \App\Models\Admin\User $user * @return mixed */ public function create(User $user) { // } /** * Determine whether the user can update the hoge. * * @param \App\Models\Admin\User $user * @param \App\Hoge $hoge * @return mixed */ public function update(User $user, Hoge $hoge) { // } /** * Determine whether the user can delete the hoge. * * @param \App\Models\Admin\User $user * @param \App\Hoge $hoge * @return mixed */ public function delete(User $user, Hoge $hoge) { // } /** * Determine whether the user can restore the hoge. * * @param \App\Models\Admin\User $user * @param \App\Hoge $hoge * @return mixed */ public function restore(User $user, Hoge $hoge) { // } /** * Determine whether the user can permanently delete the hoge. * * @param \App\Models\Admin\User $user * @param \App\Hoge $hoge * @return mixed */ public function forceDelete(User $user, Hoge $hoge) { // } }
・Laravel Hogeモデル
<?php namespace App\Models\Admin; use Eloquent as Model; /** * Class Hoge */ class Hoge extends Model { public $table = 'hogehoge'; }
App\Model\Admin\Hoge::class => App\Policies\HogePolicy::class,
のように書いてみてもダメということですよね?
はい、ダメでした。
「App\Models\Admin\Hoge::class => App\Policies\HogePolicy::class」をパターン3として追加しました。
以下の認識ですが合っていますでしょうか?
- 2つ目のソースコードはコントローラクラスのeditアクションで$hogeにはApp\Models\Admin\Hogeクラスのインスタンスが入る
- 3つ目のソースコードはApp\Policies\HogePolicyクラスでHogeはApp\Models\Admin\Hogeクラス
(一応、各ソースコードがどのクラスに書かれているものかも明記された方が良いと思います)
なお、123456 については私も試してみましたが特にエラーなどにはなりませんでした。そういうものみたいですね。
その認識で間違いありません。
そうですね。ただ記入漏れなのか、サンプルに書いていないだけなのか解らないですよね。
もう少しソースについて追記いたしました。
なるほど、エラーにならないのはそういうものなのですね。
$hoge= $this->Hoge->find($id); // Hogeモデルの検索結果取得OK
上のコードでは本当に App\Models\Admin\Hoge のインスタンスが取得されていることを確認できていますか?例えば、よく見たら別のモデルのインスタンスだったとか、コレクションになっていたなどということはないでしょうか。(しつこくてすみません)
findの結果を出力したところ、Collectionにはならずにデータを取得していたので問題ないかと思います。
出力結果の一部↓
^ App\Models\Admin\Hoge {#804 ▼
+table: "hogehoge"
#dates: array:1 [▶]
+fillable: array:1 [▶]
+sortable: array:2 [▶]
#casts: []
#connection: "mysql"
#primaryKey: "id"
#keyType: "int"
+incrementing: true
#with: []
#withCount: []
念のため確認なのですが、HogePolicyのコードは掲載されているものだけでしょうか。
例えば、beforeメソッドもあってそこでtrueを返しちゃってる、などということはないでしょうか。
policyとmodelを全文追記しました。
少し長くなってしまいますので省略して記述しておりましたが・・・。
念のため確認なのですが、以下のようなゲートをどこかに作成していてそこでtrueを返している、ということはないでしょうか。
https://readouble.com/laravel/8.x/ja/authorization.html#intercepting-gate-checks
長々とお付き合いくださり、ありがとうございます。
ソースをgrepしたところ、、、分岐を誤ってtrueを返している犯人が見つかりました!
PolicyがうまくいかないからPolicyの使い方が悪いんだろうと思い込みが思わぬ泥沼にはまってしまいました。
ありがとうございました!!!
回答2件
あなたの回答
tips
プレビュー