2016-07-15 10 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

요청 클래스

사용 권한 부여 방법

public function authorize() 
{ 
    return true; 
} 

혼란

,
  1. 접근법 2가 좋은 경우 Get, Put, Delete 및 POST에 대한 Request 클래스를 만들어야합니까?
  2. 승인을 확인하는 더 나은 방법이 있습니까?
+0

미들웨어를 사용해야합니다 –

+0

내 역할이 동적으로 생성됩니다.역할의 권한은 동적으로 할당됩니다. 그래서 나는 어떤 역할이 어떤 허가를 가지는지 전혀 모른다. 제발 제안 해주세요. – Pankaj

+0

jsut 컨트롤러에서하고 있지만 미들웨어 클래스에서하는 것처럼하면 다시 쓰거나 다시 쓸 필요가 없습니다. –

답변

0

처럼 모든 컨트롤러 생성자에서 사용할 수 있어야 I 다음과 같이하십시오 :

나는 다음과 같은 권한이 있다고 가정합시다 : 이제 Super Admin (호텔

  • 이 역할을
  • 관리 패키지를

  • 관리 관리 CMS
  • 관리

    1. 사용자에게
    2. 관리를하는 사람들 분명히 위의 모든 권한을가집니다) 역할을 만들 수 있습니다, 예를 들어 Hotel ManagerManage Hotels에 대한 권한을 지정하십시오.

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

      나는 그것에서 미들웨어와 Route Group에 넣어 것입니다 :

      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); 
          } 
      } 
      
      :

      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 미들웨어를 만들 것 같은 경로에 대한 지금

      물론이 경로를로 묶어야합니다.은 사용자가 로그인되어 있고 관리자 역할을하도록합니다.

  • +0

    ''middleware '=> ['permission : manage_hotels ']]'에 대해 자세히 설명해주십시오. 'Permission' 클래스가'미들웨어 '가 될 것이라는 것을 이해했습니다. 그러나'permission : 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

    내 생각에, 당신은 신중하게 생각하지 않았습니다. 내 역할이 동적으로 생성됩니다. 내 역할의 권한이 동적으로 생성되며 사용자에게 역할과 할당 된 역할의 권한이 할당됩니다. 모든 것이 동적입니다. 이제 관리자에게 존재하는 역할이 존재하는지 여부를 어떻게 알 수 있습니까? – Pankaj

    +0

    AdminAuthenticate (이름을 변경할 수 있음) 파일에이 ValidateAuthorization 기능을 추가 한 다음이 미들웨어로 모든 경로를 전달하십시오 –

    관련 문제