【问题标题】:How to authorise action against account that have multiple users in Laravel如何授权对 Laravel 中具有多个用户的帐户的操作
【发布时间】:2018-07-14 16:18:23
【问题描述】:

期望的结果是,用户可以为公司创建帐户,成为该公司具有超级管理员角色的第一位员工。然后,他可以创建可以访问公司帐户的其他员工帐户。

为此我有两个模型

  1. 团队(公司帐户)
  2. 用户(员工帐户)

并且团队和用户之间存在one-to-many 关系。

我为User 模型添加了全局范围,以便自动加载关联的团队,以便在视图中显示必要的信息。

User 模型是可验证的。

用户可以拥有不同的权限。例如,只允许超级管理员从团队中删除其他用户。我正在按照 Laravel 的方式使用自定义请求来验证操作

public function destroy(DeleteTeamUserRequest $request, $id)
{
   $this->users->deleteById($id);
   return redirect()->route('dashboard')->withFlashSuccess('Deleted User');
}

class DeleteTeamUserRequest extends FormRequest
{
    public function authorize()
    {
        return $this->user()->isSuperAdmin();
    }
 }

这样我可以确保没有超级管理员角色的用户不会删除其他用户。但是理论上公司 1 的超级管理员可以从公司 2 中删除用户。当然他永远不会在前端有那个 url,但是如果他修改代码,他就有删除所有用户的权限。

我总是可以在控制器中检查给定用户在团队中,但那是错误的。

我将UsersTeams 都设为可验证(为团队创建另一个网络守卫),在用户登录后手动登录团队(注销时相同),但遇到了同样的问题 - 我必须检查是否我尝试删除的用户与执行该操作的用户在同一个团队中。

{
    public function authorize()
    {
        return $this->user()->isSuperAdmin()
            && $this->team()->has($otherUser); // I dont have other user here
    }
 }

这种情况应该很常见,但我找不到关于如何正确处理这些情况的很好解释,所以我非常感谢任何建议和帮助。

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    您可以像这样在 FormRequest 中获取路由参数:

    $otherUserId = $this->route('id');
    

    您可以只获取其他用户及其团队并将其与经过身份验证的用户的团队进行比较。

    你也可以写一个小助手/服务来做同样的事情;检查 2 个用户是否属于同一个团队。

    【讨论】:

      【解决方案2】:

      您在应用程序中描述多租户。许多不同的用户或用户组可以访问相同的软件,但仅限于他们的数据。 基本上,您想要的是与给定用户的团队有关系的表上的team_id

      通常,中间件会检查用户是否属于团队,并负责在请求期间确定查询范围。例如,中间件会在->where('team_id, auth()->user()->team->id) 形式的请求生命周期中为每个查询添加一个where 子句。

      这将防止具有超级管理员角色的用户交叉污染或删除其他团队的数据,因为where 子句不允许这样做。

      有一些非常好的软件包可以提供此功能,然后还有一些。我个人最喜欢的是Landlord

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-27
        • 2019-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-27
        相关资源
        最近更新 更多