2016-07-15 3 views
0

Мои роли динамичны, а их разрешения пользователя также являются динамическими. У меня есть два подхода к проверке, разрешен ли пользователю доступ к определенной странице.Проверка авторизации в Laravel 5.2

подход 1

class BaseController extends Controller 
{ 
    public function __construct() { 
     if(!\Auth::user()->IsPredefined) { 
      $result = $this->ValidateAuthorization(); 
      if(!$result) { 
       \Auth::logout(); 
       return redirect()->route("login"); 
      } 
     } 
    } 

    private function ValidateAuthorization() { 
     $ActionName = \Route::getCurrentRoute()->getPath(); 
     switch ($ActionName) { 
      case "ChangePassword": 
       $ModuleID = ModuleEnum::AccountManagemenet; 
       $ActionID = AccountActionEnum::ChangePassword; 
       return CheckUsePermissions($ModuleID, $ActionID);    
     } 
    } 

    private function CheckUsePermissions($ModuleID, $ActionID) { 
     $User = MySession::UserPermissions(); 
     foreach($User->UserRolePermissions as $UserRolePermission) { 
      $CurrentActionID = $UserRolePermission->RolePermission->Permission->ActionID; 
      $CurrentModuleID = $UserRolePermission->RolePermission->Permission->ModuleID; 
      if($CurrentActionID == $ActionID && $CurrentModuleID == $ModuleID && 
        $UserRolePermission->IsActive == true) { 
       return true; 
      } 
     } 
     return false; 
    } 
} 

подход 2

метод использования Авторизоваться в классе Request

public function authorize() 
{ 
    return true; 
} 

Путаница

  1. Если подход 2 хорош, должен ли я создавать класс Request для каждого Get, Put, Delete и POST?
  2. Есть ли лучший подход для проверки авторизации?
+0

вы должны использовать промежуточное программное обеспечение –

+0

Мои роли будут созданы динамически.Разрешение роли будет назначено динамически. Поэтому я понятия не имею, какая роль будет иметь это разрешение. Пожалуйста, предложите. – Pankaj

+0

jsut делать это как вы делаете в контроллере, но делаете это в классе промежуточного программного обеспечения, так что вам не нужно писать его снова или снова –

ответ

0

для динамических ролей я сделать что-то вроде этого:

Пусть Предположим, у меня есть следующие разрешения:

  1. управлять пользователями
  2. Управление CMS
  3. Управление Отели
  4. Управление пакетами
  5. Управление ролями

Теперь Super Admin (кто очевидно, имеет все перечисленные выше разрешения) может создать роль, скажем, Hotel Manager и назначить разрешение только для Manage Hotels.

Теперь для маршрута, как:

Route::get('/admin/hotels', '[email protected]')->name('admin.hotels.index'); 

Я положил его в Route Group с промежуточным слоем в нем:

Route::group(['prefix' => '/admin/hotels', 'middleware' => ['permission:manage_hotels']], function() { 
    Route::get('/', '[email protected]')->name('admin.hotels.index'); 
    Route::post('/', '[email protected]')->name('admin.hotels.create'); 
}); 

Тогда я создать Permission промежуточное программное обеспечение:

class Permission 
{ 
    public function handle($request, Closure $next, $permission) 
    { 
    //if not super admin (super admin role_id is 1) 
    if(auth()->user()->role_id != 1) { 
    //explode extra param passed to this middleware (here manage_hotels) 
    $permission_array = explode('_', $permission); 

    foreach ($permission_array as $key => $value) { 
    $permission_array[$key] = ucfirst($value); 
    } 

    $permission_name = implode(' ', $permission_array); 

    $permitted = auth()->user()->role->permissions()->where('name', $permission_name)->first(); 

    if(! $permitted) { 
    return redirect()->route('admin.dashboard')->withErrors(['error' => ['message' => 'You are not allowed to perform this action.']]); 
    } 
    } 

    return $next($request); 
    } 
} 

Конечно, вам необходимо обернуть эти маршруты в Admin Middleware, который обеспечит вход пользователя в систему и будет иметь роль администратора.

+0

можете ли вы более подробно рассказать о '' middleware '=> [' permission: manage_hotels]] '? Я понял, что класс «Permission» будет «Middleware». Но что такое 'разрешение: manage_hotels'? – Pankaj

+0

С именем промежуточного программного обеспечения Все, что вы пишете после: в этом случае 'manage_hotels' будет доступен в методе' handle' этого промежуточного программного обеспечения. – Abhishek

+0

Посмотрите параметры промежуточного программного обеспечения https://laravel.com/docs/5.2/middleware#middleware-parameters – Abhishek

0

Вы должны использовать промежуточное программное обеспечение и использовать в маршрутах

Route::group(['middleware' => ['auth', 'admin']], function() { }); 

Или вы можете использовать в каждом конструкторе контроллера

public function __construct() 
{ 
    $this->middleware('auth'); 
    $this->middleware('admin'); 
} 

Администратор промежуточного слоя, как

class AdminAuthenticate 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     if (Auth::check()) { 
      if (Auth::user()->IsPredefined) { 
       $result = $this->ValidateAuthorization(); 
       if(!$result) { 
         return redirect('/logout'); 
       } 
      } 
     } 
     return $next($request); 
    } 
} 
+0

Думаю, вы не поняли мою точку зрения. Мои роли будут созданы динамически. Разрешение моей роли будет создано динамически, и пользователю будут назначены роли и назначены полномочия этой роли. Так что все динамично. Теперь скажите мне, как я узнаю, что существует роль, называемая admin, или нет. – Pankaj

+0

Добавьте эту функцию ValidateAuthorization в файл AdminAuthenticate (вы можете изменить имя), а затем передайте все маршруты этим промежуточным контентом –

Смежные вопросы