Gate:before và policy trong laravel
Mn cho em hỏi chút về việc cấp full quyền cho một user nhất định!
//Model
public function superAdmin(){
return $this->role_id === 1 ;
}
public function boot()
{
$this->registerPolicies();
Gate::before(function ($user, $author) {
return $user->superAdmin();
});
}
//policy
public function view(UserModel $user , UserModel $userModel)
{
//UserModel $user là user hiện tại đang login
return $user->id === $userModel->id;
}
//controller
public function show($id)
{
$userNow = Auth::guard('admin')->user();
$user = UserModel::findOrFail($id);
if($userNow->can('view', $userNow)){
return view('admin.user.show',[
'title' => self::TITLE,
'userInfo' => $user
]);
}else{
return redirect()->back()->with('message', 'Bạn không thể xem thông tin của người khác!');
}
}
trong controller em gọi $userNow là user đang login nhưng nếu là user có role là 1 thì xem được hết show, nhưng đến role != 1 thì lại không xem được chính bản thân mình! và khi em $userNow->can('view', $userNow) thì ide có gạch đỏ phương thức can của em mặc dù em vẫn chạy được! Thì em hiện tại mong muốn nếu là superAdmin thì có thể xem toàn bộ show còn ngược lại thì chỉ xem được chính bản thân của mình! em có 2 guard một là của admin một là của user(cái này là của khách hàng đó ạ - và mặc đinh guard('web') của laravel) Em cảm on mn !
1 CÂU TRẢ LỜI
Khi bạn gọi:
if($userNow->can('view', $userNow))
thì lúc này Gate::before
sẽ được trigger trước nên kết quả trả về của câu lệnh if đó luôn luôn là false nếu bạn không phải là admin
. Bạn bỏ thằng Gate::before
và sửa lại hàm view
trong Policy như sau:
public function view(UserModel $user , UserModel $userModel)
{
return $user->superAdmin() || $user->id === $userModel->id;
}
Dạ em hiểu rồi ạ! em cảm ơn