2015-05-14 2 views
2

Я реализовал роли Entrust для уровня ACL. Теперь я планирую автоматизировать проверку разрешений для каждого запроса, чтобы каждый раз, когда мне не нужно было писать разрешения для ролей пользователя.Автоматизация Разрешения Entrust с доступом к параметрам имени маршрута и проверка разрешения пользователя

например. У меня есть ресурс компании и роль пользователя как «админ», он может просматривать только компанию и другую роль пользователя, поскольку «супер» может управлять компанией. В базе данных я предоставил им соответствующие разрешения, но в промежуточном программном обеспечении, чтобы проверить разрешение, я планирую это сделать:

если URL-адрес идет: localhost/company/create - в разрешении БД будет создана_компонент и текущий вход в систему будет проверяться на основании этого разрешения.

$user->can('create_company') OR 
$user->can(['create_company', 'view_company']); 

Que1: Возможно ли это, чтобы достичь этого со средней посуды, где имена маршрутов eg.company.create, company.show доступны (так, что точки заменяются на «_» и мы можем проверить разрешение)? Как?

Que2: Является ли этот хороший подход к автоматической проверке роли или существует другой подход.

Любая помощь/предложение были бы высоко оценены.

ответ

2

Ну, я нашел ответ, и в некоторой степени я сделал автоматическое тестирование разрешений. Я создал функцию в 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 ИЛИ 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 (домашнюю) страницу и супер пользователь не столкнется с любой такой аутентификации поэтому он исключен.

+0

Tarunn, редактирование, которое я сделал, было [удалить шум из вашего ответа] (http://meta.stackexchange.com/q/2950). Некоторые приветствия автоматически удаляются, другие, как это, оставляют для редакторов, чтобы они аккуратно сохраняли информацию в сообщении. Stack Overflow - это не форум; нет необходимости просить людей отвечать лучшими ответами, так как всегда есть открытое приглашение для этого. С благодарностью в нем ваш ответ появляется в списке сообщений, которые могут заслуживать удаления; мое редактирование предназначено для сохранения вашего ответа. Если вы хотите сохранить его как есть, это ваш выбор. – Mogsdad