Laravel:路由中间件和策略之间的区别
使用laravel开发应用程序时,我意识到可以做的事情可以完全用来完成。假设我想阻止用户更新路由,如果他/她不是信息的所有者,我可以很容易地从路由检查,也可以从策略中执行相同的操作。Policy
Middleware
所以我的问题是,为什么我应该使用中间件,反之亦然。policy
使用laravel开发应用程序时,我意识到可以做的事情可以完全用来完成。假设我想阻止用户更新路由,如果他/她不是信息的所有者,我可以很容易地从路由检查,也可以从策略中执行相同的操作。Policy
Middleware
所以我的问题是,为什么我应该使用中间件,反之亦然。policy
我目前正在对我的角色,权限和路由进行小型重构,并问自己同样的问题。
在表面上,似乎真正的中间件和策略执行相同的一般思想。检查用户是否可以执行他们正在做的事情。
参考这里是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....
}
路由中间件允许您将请求处理应用于大量路由,而不是在每个控制器操作中重复代码 - 检查身份验证和重定向来宾就是一个很好的例子。相反,控制器包含特定路由/操作所独有的逻辑 - 您可以使用中间件来实现此目的,但是您需要为每个路由的逻辑使用单独的中间件,并且它们都会变得非常混乱。
策略/能力只是检查用户权限的一种方式 - 您可以从控制器、中间件或其他任何位置查询它们。它们只返回 true 或 false,因此它们不等同于控制器或中间件。大多数时候,能力会将用户与另一个模型进行比较,该模型将基于发送到控制器操作的标识符加载,但可能也有一些应用程序与中间件一起使用。