如何针对Laravel中具有多个用户的帐户授权操作

时间:2018-02-04 19:01:54

标签: php laravel laravel-5

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

为此,我有两个模型

  1. 团队(公司帐户)
  2. 用户(员工帐户)
  3. 并且团队与用户之间存在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.当然,他在前端永远不会有这个网址,但如果他调整代码,他就有权删除所有用户。

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

    我使UsersTeams都可以进行身份​​验证(为团队创建另一个网络守卫),一旦用户登录就手动登录团队(登出时也一样)但遇到了同样的问题 - 我必须检查我尝试删除的用户是否与执行操作的用户在同一个团队中。

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

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

2 个答案:

答案 0 :(得分:0)

您可以在FormRequest中获取路径参数,如下所示:

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

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

你也可以写一个小帮手/服务,也可以这样做;检查2个用户是否属于同一个团队。

答案 1 :(得分:0)

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

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

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

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