Laravel:路径中间件和策略之间的区别

Jam*_*rge 20 php policy middleware laravel

我正在使用laravel开发一个应用程序,我意识到可以完成的任务Policy可以完成Middleware.假设我想阻止用户更新路线,如果他/她不是信息的所有者,我可以轻松地从路线检查并且可以从策略中做同样的事情.

所以我的问题是为什么我应该使用policy中间件,反之亦然

小智 47

我目前正在通过我的角色,权限和路线的小型重构,并问自己同样的问题.

在表面层面,看起来真正的中间件和策略执行相同的一般想法.检查用户是否可以执行他们正在执行的操作.

这里参考laravel docs ...

中间件 "我可以看到这个吗?我可以去这里吗?"

HTTP中间件提供了一种方便的机制,用于过滤进入应用程序的HTTP请求.例如,Laravel包含一个中间件,用于验证应用程序的用户是否经过身份验证.如果用户未经过身份验证,则中间件会将用户重定向到登录屏幕.但是,如果用户通过身份验证,则中间件将允许请求继续进入应用程序.

当然,除了身份验证之外,还可以编写其他中间件来执行各种任务.CORS中间件可能负责为离开您的应用程序的所有响应添加正确的标头.日志记录中间件可能会将所有传入请求记录到您的应用程序

https://laravel.com/docs/master/middleware#introduction

在我的阅读中,中间件是关于在请求级别操作.在"此用户可以查看页面吗?"或"此用户可以在此处执行某些操作吗?"的条款中.

如果是,则转到与该页面关联的控制器方法.有趣的是,中间件可能会说,"是的,你可能去那里,但我会记下你要去的." 等等.

一旦完成.它没有更多的控制权或说出用户在做什么.另一种方式我认为它是中间人.

政策 "我可以这样做吗?我能改变吗?"

除了提供开箱即用的身份验证服务外,Laravel还提供了一种组织授权逻辑和控制资源访问的简单方法.有许多方法和帮助可以帮助您组织授权逻辑,我们将在本文档中介绍它们中的每一个.

https://laravel.com/docs/master/authorization#introduction

然而,政策似乎更关心这样做.用户可以更新任何条目,还是只更新他们的条目?

这些问题似乎适用于控制器方法,其中对资源的所有调用操作都进行了组织.检索此对象,存储或更新文章.

正如tjbb所提到的,中间件可以使路由非常混乱并且难以管理.这是我的路线文件中的一个示例:

问题

    Route::group(['middleware' =>'role:person_type,person_type2',], function () {
        Route::get('download-thing/{thing}', [
             'as' => 'download-thing', 
             'uses' => 'ThingController@download'
        ]);
    }); 
Run Code Online (Sandbox Code Playgroud)

这在我的路线文件中非常难以阅读!

政策的另一种方法

//ThingController
public function download(Thing $thing)
{
    //Policy method and controller method match, no need to name it
    $this->authorize($thing);

    //download logic here....
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案!该策略的另一个好处是您可以通过“can”命令在刀片模板中使用它。 (3认同)

tjb*_*jbp 17

路由中间件允许您将请求处理应用于大范围的路由,而不是在每个控制器操作中重复代码 - 检查身份验证和重定向来宾是一个很好的例子.控制器包含对特定路由/操作唯一的逻辑 - 您可以使用中间件,但是您需要为每个路由的逻辑分别使用中间件,而且它们都会变得非常混乱.

策略/功能只是检查用户权限的一种方式 - 您可以从控制器,中间件或其他任何位置查询它们.它们只返回true或false,因此它们不等同于控制器或中间件.大多数时间的能力是将用户与另一个模型进行比较,该模型将根据发送到控制器操作的标识符进行加载,但也可能有一些应用程序也可用于中间件.