【问题标题】:Laravel authorize always returns falseLaravel 授权总是返回 false
【发布时间】:2018-01-07 13:34:06
【问题描述】:

我在 Laravel 上的策略有一些问题。问题是,我的创建策略总是返回 false,无论我做什么,即使我明确地让它“返回 true”,它也会给我 403 禁止。 重要的是要提到我正在使用 axios 向我的 MenuController@store 函数发出 POST 请求,然后在我的商店函数中我从我的策略中调用 $this->authorize('create') ...

看看:

MenuController@store

public function store(StoreMenuRequest $request, Shop $shop)
{
    $this->authorize('create', [Auth::user(), $shop]);
    $menu = new Menu;

    $menu->name = $request->name;
    $menu->slug = str_slug($menu->name, "-");
    $menu->shop_id = $shop->id;

    $menu->save();

    return $menu->load('items');
}

菜单策略

public function create(User $user, Shop $shop)
{
    return $user->owns($shop);
}

* 请注意,即使我“返回 true”,它也不会起作用...

Axios 请求

addNewMenu()
            {   
                var _this = this;
                axios.post('{{ Route('chef.menus.store', $shop) }}', {
                    name : this.menuName
                }).then(function(response){
                    // Menu saved
                }).catch(function(error){
                    // Errors
                });
            }

无论我做什么,我都会从我的创建策略中得到错误。 请注意,当我从控制器中删除 $this->authorize() 函数时,一切正常,所以我认为授权是问题所在,对吧?

我的 AuthServiceProvider 似乎没问题:

protected $policies = [
    'App\Model' => 'App\Policies\ModelPolicy',
    'App\Shop' => 'App\Policies\ShopPolicy',
    'App\Menu' => 'App\Policies\MenuPolicy'
];

谁能帮我解决这个问题? :( 非常感谢任何帮助。 非常感谢!

**** 编辑 ****

对于任何可能正在为此苦苦挣扎的人,我弄清楚了发生了什么,因为我正在对链接到菜单模型的 MenuPolicy 进行此验证,并且我正在将 Shop 实例传递给 create()方法,我想它不会起作用,我可能误解了 poilcy 的工作原理...... 所以为了解决这个问题,我刚刚在我的 Shop 策略中创建了一个“createMenu()”函数,这样我可以将一个 Shop 实例传递给该方法,它会正常工作:),因为我只需要验证 Shop 是否是归当前用户所有。

【问题讨论】:

    标签: php laravel authorization axios policy


    【解决方案1】:

    在 Laravel 文档中有 this 示例:

    $this->authorize('create',  $shop);
    

    所以你不应该需要传入用户

    【讨论】:

    • 感谢您的回复!但是如果我这样做,那么授权将始终返回true!哈哈,即使我“return false”,它也会被忽略
    • 你的路由有 auth 中间件吗?你用dd(Auth::user())获得用户?
    • 是的,我的路由有 auth 中间件,我的 Auth::user() 和我的 $shop 都很好 :(,我在 store() 函数上做了 dd() 然后用控制台读取.log() 在我的 axios 请求中......两者都很好。真的很奇怪
    猜你喜欢
    • 2021-04-11
    • 2019-01-31
    • 2020-04-19
    • 2021-04-05
    • 2019-06-28
    • 2016-05-22
    • 2016-07-19
    • 2017-04-01
    • 2014-02-25
    相关资源
    最近更新 更多