我目前正在对我的角色、权限和路线进行一次小型重构,并问自己同样的问题。
从表面上看,真正的中间件和策略似乎执行相同的总体思路。检查用户是否可以做他们正在做的事情。
参考这里的 laravel 文档...
中间件
“我可以看看这个吗?我可以去这里吗?”
HTTP 中间件提供了一种方便的过滤 HTTP 的机制
请求进入您的应用程序。例如,Laravel 包含一个
验证应用程序用户的中间件是
认证。如果用户未通过身份验证,中间件将
将用户重定向到登录屏幕。但是,如果用户是
经过身份验证,中间件将允许请求继续进行
进一步进入应用程序。
当然,可以编写额外的中间件来执行各种
除了身份验证之外的任务。 CORS 中间件可能是
负责为所有离开的响应添加正确的标题
你的申请。日志中间件可能会记录所有传入的请求
到您的应用程序。
https://laravel.com/docs/master/middleware#introduction
在我的阅读中,中间件是关于在请求级别操作的。在“这个用户可以看到一个页面吗?”或“这个用户可以在这里做点什么吗?”的术语中。
如果是这样,它会转到与该页面关联的控制器方法。有趣的是,中间件可能会说:“是的,你可以去那里,但我会写下你要去的地方。”等等。
一旦完成。它对用户正在做的事情没有更多的控制权或发言权。我认为它是中间人的另一种方式。
政策
“我可以这样做吗?我可以改变这个吗?”
除了提供开箱即用的身份验证服务外,
Laravel 还提供了一种简单的方式来组织授权逻辑和
控制对资源的访问。有多种方法和
帮助您组织授权逻辑的助手,以及
我们将在本文档中介绍它们。
https://laravel.com/docs/master/authorization#introduction
然而,政策似乎更关心做。用户可以更新任何条目,还是只更新他们的条目?
这些问题似乎适合控制器方法,其中所有对资源的操作调用都被组织起来。检索此对象,存储或更新文章。
作为tjbb mentioned,中间件会使路由变得非常混乱且难以管理。这是我的路线文件中的一个示例:
问题
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....
}