Laravel5.2で認証を検証する

パンカイ

私の役割は動的であり、ユーザーの権限も動的です。ユーザーが特定のページへのアクセスを許可されているかどうかを検証するには、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クラスでAuthorizeメソッドを使用する

public function authorize()
{
    return true;
}

錯乱

  1. アプローチ2が適切な場合、Get、Put、Delete、POSTごとにRequestクラスを作成する必要がありますか?
  2. 承認を検証するためのより良いアプローチはありますか?
アビシェク

動的ロールの場合、次のようにします。

次の権限があるとします。

  1. ユーザーの管理
  2. CMSを管理する
  3. ホテルを管理する
  4. パッケージの管理
  5. 役割の管理

これで、Super Admin(明らかに上記のすべてのアクセス許可を持っている)は、ロールを作成し、Hotel Managerにのみアクセス許可を割り当てることができManage Hotelsます。

次のようなルートの場合:

Route::get('/admin/hotels', 'HotelsController@index')->name('admin.hotels.index');

Route Groupミドルウェアを入れてに入れます:

Route::group(['prefix' => '/admin/hotels', 'middleware' => ['permission:manage_hotels']], function () {
  Route::get('/', 'HotelsController@index')->name('admin.hotels.index');
  Route::post('/', 'HotelsController@create')->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て、ユーザーがログインし、管理者の役割を持っていることを確認する必要があります。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事