2016-07-15 6 views
0

私の役割は動的で、そのユーザーの権限も動的です。ユーザーに特定のページへのアクセスが許可されているかどうかを検証する2つの方法があります。リクエストクラス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の各リクエストクラスを作成する必要がありますか?
  2. 承認を検証する方法はありますか?
+0

ミドルウェアを使用する –

+0

私の役割は動的に作成されます。ロールの権限は動的に割り当てられます。だからどの役割がどのパーミッションを持つのか分かりません。提案してください。 – Pankaj

+0

jsutあなたはコントローラーでやっているようにしますが、ミドルウェアクラスでやり直してください。それで、もう一度やり直す必要はありません。 –

答えて

0

のようなすべてのコントローラのコンストラクタ

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

管理ミドルウェアで使用することができますで使用する必要があります次のようなことをしてください:

は私が権限を以下しているとしましょう:

  1. ユーザー
  2. がCMS
  3. はホテル
  4. はパッケージ
  5. が役割

Super Admin(管理管理管理管理管理明らかにすべての上記の権限を持っている)は役割を作成することができます、 Hotel Managerとし、Manage 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() { }); 

それとも、私は動的な役割について

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関数を追加してから、このミドルウェアですべてのルートを渡します –

関連する問題