除用户()

时间:2017-01-22 15:44:51

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

我们可以使用除User之外的中间件吗?我的意思是......几乎在每个例子或解释中他们都使用$request->user()来检查用户的权限。

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

中间件可以吗?

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

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

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

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

群组(Access_Specify = 0:公开,1:会员,2:仅限我)&& GroupMember(UserStatus = 0:PendingForApproval,1:JoinedAsMember)

if(以上条件为真){

  • 相册
  • 等。

} else {  用户输出错误 - 异常 }

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

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

1 个答案:

答案 0 :(得分:2)

使用门

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

实施例

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

定义门

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

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

使用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,在其中创建所有支票并在$policies的{​​{1}}数组中注册。

通过这种方式,您可以在如何以及何时调用此政策方面拥有一些选项。

  • 通过用户模型
  • 通过中间件
  • Via Controller helpers
  • 通过刀片模板

同样,the official documentation about registering and using Policies在解释所有这些方面做得非常出色。