【问题标题】:Laravel Middleware with other than user()除了 user() 之外的 Laravel 中间件
【发布时间】:2017-01-22 15:44:50
【问题描述】:

我们可以将中间件与用户方法以外的方法一起使用吗?我的意思是……几乎在每个示例或解释中,他们都使用$request->user() 来检查用户的权限。

但是我想在$request->category() 等其他表中检查用户的权限。在那里我想检查用户是否是该特定类别的所有者。在此基础上,该类别的所有者可以在该类别中的各个部分(控制器)中移动,否则他将受到限制。

中间件可以吗?

============ 这里有更好的解释 ================

假设我拥有一个组(使用 Access_Specify> 0:Public,1:Member,2:Only Me)。现在其他用户可能/可能不订阅该组以成为该组的成员/公众。除此之外,群组还有专辑、页面、帖子等子部分。

现在,我想要在进入该组之前检查 2 个表 中即将到来的用户的权限。首先在组中(通过 Access_Specify),然后在 GroupMember 中的第二个,如果即将到来的用户是否是该组的成员。

案例条件:如果组的 Access_Specify 设置为 1(成员访问权限),则只有成员(该组的所有者)才能进入该组。

Group (Access_Specify= 0:Public, 1:Member, 2:Only Me) && GroupMember (UserStatus= 0:PendingForApproval, 1:JoinedAsMember)

如果(以上条件为真){

  • 专辑
  • 页数
  • 发布
  • 等等..

} 其他 { 抛出错误的用户 - 异常 }

======================================

在任何情况下,我都不想把这个条件放在控制器中,因为......我不能在每个子部分(控制器)中一次又一次地放置和检查。我想要像中间件一样的解决方案,检查用户,然后才处理请求。

【问题讨论】:

  • 假设你已经在用户上定义了一个类别关系,最简单的方法是通过$request->user()->category
  • 感谢@apokryfos,您在这里提供了良好且快速的逻辑。您的解决方案是可以接受的,但是 Andréas Lundgren 在下面描述了官方解决方案。再次感谢。
  • 您好@apokryfos 请再次检查我的问题,我确实再次对其进行了编辑并解释了我在那里面临的确切问题。提前致谢。
  • 是的,我可能没有正确理解您的要求。
  • 这里有什么建议吗?

标签: php laravel-5 permissions frameworks laravel-middleware


【解决方案1】:

使用门

对于简单的东西,你可以写 Gates。它们通常在应用程序服务提供者中定义,例如AuthServiceProvider

示例

在您的服务提供者的boot() 方法中,您可以定义将检查给定$user 是否拥有给定$category 的门:

定义门

Gate::define('update-category', function ($user, $category) {
    return $user->id == $category->user_id;
});

$user 是 Laravel 在使用 Gate 时自动传递的必需参数,您可以传递任何需要检查的其他参数。

使用门

当您需要检查用户是否拥有该类别时,只需调用:

if (Gate::allows('update-category', $category)) {
    // The current user can update the category...
}

if (Gate::denies('update-category', $category)) {
    // The current user can't update the category...
}

您可以在the official documentation for authorization找到更多关于盖茨的信息

使用政策

对于更高级的授权,使用Policies 可能更合适。策略是围绕特定模型或资源组织授权逻辑的类。

因此,您可以创建一个CategoryPolicy,在其中创建所有检查并将其注册到AuthServiceProvider$policies 数组中。

这样一来,您就可以选择如何以及何时调用此政策。

  • 通过用户模型
  • 通过中间件
  • 通过控制器助手
  • 通过 Blade 模板

同样,the official documentation about registering and using Policies 出色地解释了所有这些。

【讨论】:

  • 谢谢@Andréas Lundgren,你真的为我的问题提供了很好的官方解决方案。肯定会使用这个解决方案。
  • 这是我想避免的一个限制。使用 Gate/Policies,我们必须在每个控制器中检查“Gate::allows/denies”。我从来不想。如果用户没有像中间件那样被授权,我不想去控制器。中间件在 Handle 方法中检查用户的权限。那么是否可以在点击控制器之前进行检查。因为我在 Category 下有 8-9 个控制器,我无法在每个控制器中检查它。
  • 你好@Andréas Lundgren。请再次检查我的问题,我确实对其进行了编辑并解释了我面临的确切问题。提前致谢。
猜你喜欢
  • 2021-06-18
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多