限制某些用户在Laravel中更新或查看其他用户数据

时间:2019-07-18 20:25:29

标签: laravel

我有角色管理器用户,我只希望他们更新或查看与管理器用户属于同一部门的其他用户(员工)数据。如果经理用户与其尝试更新的用户不在同一部门,则应将其重定向回去。 也就是说,经理可能会尝试更改URL中的用户ID,而我想拒绝对该用户是否属于另一个部门的访问。 我已经设置了所有角色和权限。

  

部门字段位于用户表中

public function show($id)
{
    $team = User::where('id', $id)->with('roles')->first();

    return view('backend.user.team.show', compact('team'));
}

public function edit($id)
{
    $user_roles = Role::all();
    $team = User::find($id);
    $business = Business::all();

    return view('backend.user.team.edit', compact('team', 'user_roles', 'business'))->with('user', auth()->user());
}

1 个答案:

答案 0 :(得分:0)

您应该使用policiesgates

看一下文档:

Writing policies

Writing gates

基本上,您应该执行以下操作:

创建一个策略来处理您的用户权限:

php artisan make:policy UsersPolicy

此命令将在UsersPolicy目录中创建一个App/policies/文件。

打开UsersPolicy文件,并在该文件中创建一个checkUserDepartament

public function checkUserDepartament(User $user, User $userToBeManaged)
{
    return $user->departament === $userToBeManaged->departament;
}

如果当前登录的用户部门与您要编辑的用户相同,则上面的函数返回true。否则,返回false。

在您的AuthServiceProvide中:

Gate::define('user-belongs-to-same-departament', 'App\Policies\UsersPolicy@checkUserDepartament');

要使用Gate,请在您的控制器中执行以下操作:

use Gate; //At the top of the controller.
// I assume that $id is the id of the user you want to edit.
public function edit($id)
{
    if(Gate::allows('user-belongs-to-same-departament', User::find($id))){
        $user_roles = Role::all();
        $team = User::find($id);
        $business = Business::all();

        return view('backend.user.team.edit', compact('team', 'user_roles', 'business'))->with('user', auth()->user());

    }else {
        return response('Unauthorized', 401);
    }
}

希望有帮助。