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

2022-08-30 12:50:24

使用laravel开发应用程序时,我意识到可以做的事情可以完全用来完成。假设我想阻止用户更新路由,如果他/她不是信息的所有者,我可以很容易地从路由检查,也可以从策略中执行相同的操作。PolicyMiddleware

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


答案 1

我目前正在对我的角色,权限和路由进行小型重构,并问自己同样的问题。

在表面上,似乎真正的中间件和策略执行相同的一般思想。检查用户是否可以执行他们正在做的事情。

参考这里是laravel文档...

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

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

这在我的路由文件中变得非常难以阅读!

政策的另一种方法

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

    //download logic here....
}

答案 2

路由中间件允许您将请求处理应用于大量路由,而不是在每个控制器操作中重复代码 - 检查身份验证和重定向来宾就是一个很好的例子。相反,控制器包含特定路由/操作所独有的逻辑 - 您可以使用中间件来实现此目的,但是您需要为每个路由的逻辑使用单独的中间件,并且它们都会变得非常混乱。

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


推荐