Я реализовал Entrust Roles для уровня ACL. Теперь я планирую автоматизировать проверку разрешений для каждого запроса, чтобы каждый раз, когда мне не нужно было писать разрешения для ролей пользователя.
например. У меня есть ресурс компании и роль пользователя как «админ», он может просматривать только компанию и другую роль пользователя, поскольку «супер» может управлять компанией. В базе данных я предоставил им соответствующие разрешения, но в промежуточном программном обеспечении, чтобы проверить разрешение, я планирую это сделать:
если url идет: localhost / company / create – в разрешении БД будет создана группа create_company, и текущий зарегистрированный пользователь будет проверен на основании этого разрешения.
$user->can('create_company') OR $user->can(['create_company', 'view_company']);
Que1: Возможно ли это достичь со средним продуктом, где доступны имена маршрутов eg.company.create, company.show (так что точки заменены на «_», и мы можем проверить разрешение)? Как?
Que2: Является ли этот хороший подход к автоматическим проверкам роли или существует другой подход.
Любая помощь / предложение будут высоко оценены.
Я нашел ответ, и в какой-то степени я сделал автоматическое тестирование разрешений. Я создал функцию в промежуточном программном обеспечении Authenticate.php
public function autocheckroles($request) { $perms = ''; $delimiter = '_'.$request->segment(1); if($request->isMethod('GET')){ if(is_numeric($request->segment(2)) && is_null($request->segment(3))){ $perms = 'show'.$delimiter; } elseif($request->segment(3) == 'edit' && is_numeric($request->segment(2))){ $perms = 'edit'.$delimiter; } elseif ($request->segment(2) == 'create'){ $perms = 'create'.$delimiter; } elseif(is_null($request->segment(2)) && is_null($request->segment(3)) && ! is_null($request->segment(1))){ $perms = 'view'.$delimiter; } } elseif($request->isMethod('POST')){ if($request->segment(1)){ $perms = 'create'.$delimiter; } } elseif($request->isMethod('DELETE')){ $perms = 'delete'.$delimiter; } elseif($request->isMethod('PUT') || $request->isMethod('PATCH')){ if($request->segment(1)){ $perms = 'edit'.$delimiter; } } return $perms; }
Это возвращает мне разрешение, основанное на методе запроса. Например, create_perm OR create_role ИЛИ edit_role. Таким образом, я не пишу каждое разрешение в промежуточном программном обеспечении. Он будет автоматически проверяться на основе запроса.
// Check for the user role and automate the role permission $perform_action = $this->autocheckroles($request); // Super Admin with id number 1 dosen't require any permission if((\Auth::user()->id == '1') || \Auth::user()->can($perform_action)){ return $next($request); } else { \Session::flash('flash_message', 'You are not authorized for this page.'); return new RedirectResponse(url('/home')); }
Таким образом, если пользователь не авторизован, он будет перенаправлен на страницу Dashboard (home), и суперпользователь не столкнется с такой аутентификацией, поэтому он исключен.