是否可以将 Laravel 策略应用于路由和自定义函数?

Posted

技术标签:

【中文标题】是否可以将 Laravel 策略应用于路由和自定义函数?【英文标题】:Is It Possible to Apply Laravel Policy to Both Routes and Custom Function? 【发布时间】:2019-03-06 12:19:24 【问题描述】:

我有位置策略和一个 api 和一个自定义助手,我想使用相同的策略,

这里是例子:

1。读取位置记录的路由/API:

 Route::group(['middleware' => 'policy:view,location'], function () 
        // Read location
        Route::post('/locations/location_id', [
            'uses'       => 'LocationApiController@read'
        ]);
  );

2。自定义函数/助手读取位置记录

LocationHelper.php

/**
 * Class LocationHelper.
 */
class LocationHelper

    /** @var LocationRepositoryInterface */
    private $locationRepo;

    /**
     * ReminderHelper constructor.
     */
    public function __construct()
    
        $this->locationRepo = App::make(LocationRepositoryInterface::class);
    

    /**
     * @param int $locationId
     */
    public function readLocation($locationId)
    
        $this->locationRepo->read($locationId);
    

问题是:

调用位置读取路由/api 策略时将适用,而从LocationHelper.php 调用读取函数时将不适用

我想要的是对两者应用相同的政策。

有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

您可以在检索用户后手动调用该策略。例如:

$allowed = Auth::user()->can('view', Location::firstOrFail($locationId));

如果不允许用户查看资源,则返回 403,如下所示:

abort_unless($allowed, 403); 

【讨论】:

感谢您的宝贵时间,但是还有其他统一的解决方案吗? 您可以创建自己的一些抽象并尝试在 LocationRepository 中添加此检查,例如让它实现一个自定义的 PolicyInterface,但我真的不认为它会让事情变得更容易。 Laravel 不提供开箱即用的自定义帮助方法的授权检查。

以上是关于是否可以将 Laravel 策略应用于路由和自定义函数?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 检查给定 url 的路由是不是存在于路由中

Laravel - 控制器中路由的中间件

在 Laravel 中:如何根据 URI 将多个过滤器应用于一整套路由?

将引导程序和自定义 css 应用于 django 中的 form 元素

React Router v4 baseName 和自定义历史

'仅授权'资源的特定路径