tohokuaikiのチラシの裏

技術的ネタとか。

Laravelで"This action is unauthorized."と出て、Policy設定してるのに…とModelの関係を追ってみた件

あるControllerを継承した別のControllerで

<?php
        $this->authorizeResource(Order::class, 'order');

したら、Policyがスルーされてしまった。

authorizeResource()の引数は何に使われるのか?

第一引数から、Policyが設定される。上の場合だと、OrderPolicyになる。

第二引数からは、Routeから得られるパラメータを指定してる…らしい。order/show/{order}のやつね。多分。

Policyのメソッドは何が使われるのか?

単純にPOSTメソッドの場合はController::storeメソッドで、Policy::create()なんじゃないの?と思っていたが、

<?php
    public function create(User $user)
    {

だと、コールされなかった。

なぜなら、$userがnullだったから。未ログインユーザーの場合はここに到達できず、ということはメソッド自体が無くUnauthorizeとなる。

ということで、$userがnullの場合の解決法

<?php
    public function create(User $user = null)
    {

とする。

これでnullの場合もこのPolicyのcreate()が使われる。

しかしまぁ、

結局、Controllerのメソッドで

<?php
    public function store(Request $request){
        $this->authorize('create_other', Preorder::class);

と明示的に指定してPolicyにcreate_otherメソッドを生やして対応した方が筋はいいのかな。