我有角色管理器用户,我只希望他们更新或查看与管理器用户属于同一部门的其他用户(员工)数据。如果经理用户与其尝试更新的用户不在同一部门,则应将其重定向回去。 也就是说,经理可能会尝试更改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());
}
答案 0 :(得分:0)
您应该使用policies
和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);
}
}
希望有帮助。