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'
        ]);
    }); 
这在我的路线文件中非常难以阅读!
政策的另一种方法
//ThingController
public function download(Thing $thing)
{
    //Policy method and controller method match, no need to name it
    $this->authorize($thing);
    //download logic here....
}
tjb*_*jbp 17
路由中间件允许您将请求处理应用于大范围的路由,而不是在每个控制器操作中重复代码 - 检查身份验证和重定向来宾是一个很好的例子.控制器包含对特定路由/操作唯一的逻辑 - 您可以使用中间件,但是您需要为每个路由的逻辑分别使用中间件,而且它们都会变得非常混乱.
策略/功能只是检查用户权限的一种方式 - 您可以从控制器,中间件或其他任何位置查询它们.它们只返回true或false,因此它们不等同于控制器或中间件.大多数时间的能力是将用户与另一个模型进行比较,该模型将根据发送到控制器操作的标识符进行加载,但也可能有一些应用程序也可用于中间件.