質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

2回答

2876閲覧

LaravelのPolicyが実行されない

hiro_app

総合スコア123

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2021/02/02 11:13

編集2021/02/08 11:21

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'; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lulucom

2021/02/03 12:58 編集

App\Model\Admin\Hoge::class => App\Policies\HogePolicy::class, のように書いてみてもダメということですよね?
hiro_app

2021/02/04 10:36

はい、ダメでした。 「App\Models\Admin\Hoge::class => App\Policies\HogePolicy::class」をパターン3として追加しました。
Lulucom

2021/02/04 11:05

以下の認識ですが合っていますでしょうか? - 2つ目のソースコードはコントローラクラスのeditアクションで$hogeにはApp\Models\Admin\Hogeクラスのインスタンスが入る - 3つ目のソースコードはApp\Policies\HogePolicyクラスでHogeはApp\Models\Admin\Hogeクラス (一応、各ソースコードがどのクラスに書かれているものかも明記された方が良いと思います) なお、123456 については私も試してみましたが特にエラーなどにはなりませんでした。そういうものみたいですね。
hiro_app

2021/02/05 01:47

その認識で間違いありません。 そうですね。ただ記入漏れなのか、サンプルに書いていないだけなのか解らないですよね。 もう少しソースについて追記いたしました。 なるほど、エラーにならないのはそういうものなのですね。
Lulucom

2021/02/05 04:35 編集

$hoge= $this->Hoge->find($id); // Hogeモデルの検索結果取得OK 上のコードでは本当に App\Models\Admin\Hoge のインスタンスが取得されていることを確認できていますか?例えば、よく見たら別のモデルのインスタンスだったとか、コレクションになっていたなどということはないでしょうか。(しつこくてすみません)
hiro_app

2021/02/05 05:09

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: []
Lulucom

2021/02/08 11:02

念のため確認なのですが、HogePolicyのコードは掲載されているものだけでしょうか。 例えば、beforeメソッドもあってそこでtrueを返しちゃってる、などということはないでしょうか。
hiro_app

2021/02/08 11:23

policyとmodelを全文追記しました。 少し長くなってしまいますので省略して記述しておりましたが・・・。
hiro_app

2021/02/09 04:35

長々とお付き合いくださり、ありがとうございます。 ソースをgrepしたところ、、、分岐を誤ってtrueを返している犯人が見つかりました! PolicyがうまくいかないからPolicyの使い方が悪いんだろうと思い込みが思わぬ泥沼にはまってしまいました。 ありがとうございました!!!
guest

回答2

0

App\Models\Admin\Hoge::class => App\Policies\HogePolicy::class


\App\Models\Admin\Hoge::class => App\Policies\HogePolicy::class
先頭の\がないと現在のネームスペース配下になるので
App\Providers\App\Models\Admin\Hoge::class
と解釈されてそうです。

それでなんでエラーにならないかといえば、登録時じゃなくて
実行時に初めてキーにアクセスされるからですね。PHPってそういうものです

投稿2021/02/05 02:02

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiro_app

2021/02/05 04:20

ありがとうございます。 先頭の\についてですが、namespace定義通りですので、なくても問題なさそうでした。 サンプルソースコードへnamespaceを追記いたしました。
mikkame

2021/02/05 04:43

https://ideone.com/9cl4SE 検証コードを用意しました。 useしてあっても、\がない限り現在のnamespaceからの相対パスになります。 または Hoge::class のようにuseした対象クラス名だけにしてください
hiro_app

2021/02/05 05:02

デバッグ方法までご教授頂きありがとうございます。 namespaceについては、ご指摘の通りの状態になっておりました。 App\Models\Admin\Hoge::class → App\Providers\App\Models\Admin\Hoge::class App\Policies\HogePolicy::class → App\Providers\App\Policies\HogePolicy::class となっていましたので、正しくパスが取得できていた下記のみにサンプルソースを修正しました。 Hoge::class →App\Models\Admin\Hoge::class HogePolicy::class → App\Policies\HogePolicy::class
hiro_app

2021/02/05 05:22 編集

コントローラーのタイミングで「dd(policy(Hoge::class));」を出力させたところ ^ App\Policies\HogePolicy {#724} と出力されたので、関連付けは上手くいったようです。
mikkame

2021/02/05 08:54

じゃああとは $hoge がHogeのインスタンスか確認しましょう。
hiro_app

2021/02/05 10:32

Controller editメソッドの「$hoge= $this->Hoge->find($id);」は、少し追加処理があるものの、戻り値は「Hoge::find($id)」です。 ログに吐き出しても、↓のようにHogeモデルになっていて、collectionでもないようです。 出力結果の一部↓ ^ App\Models\Admin\Hoge {#804 ▼ +table: "hogehoge" #dates: array:1 [▶]
guest

0

ベストアンサー

HogePolicyクラスのeditメソッドをupdateメソッドに変更し、
コントローラクラスのeditアクションではauthorizeメソッドへの第1引数を'update'に変更するとどうでしょうか。

HogePolicyクラス

php

1 public function update(User $user, Hoge $hoge) 2 { 3 return false; 4 }

コントローラのeditアクション

php

1 $this->authorize('update', $hoge);

投稿2021/02/05 02:18

Lulucom

総合スコア1899

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiro_app

2021/02/05 04:20

update、viewなどにしても変化はありませんでした。。。
hiro_app

2021/02/09 04:36

ソースへの追記・修正依頼側で長々とお付き合いくださり、無事解決しました。 ありがとうございました。
Lulucom

2021/02/09 04:39 編集

いえいえ良かったです。 > 以下のようなゲートをどこかに作成していてそこでtrueを返している、ということはないでしょうか。 これが原因だったということでしょうか?その場合はそのように回答に追記しておこうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問