验证Laravel 5.2中的授权

时间:2016-07-15 06:39:58

标签: laravel laravel-5 laravel-5.1 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 class中使用Authorize方法

public function authorize()
{
    return true;
}

混乱

  1. 如果方法2好,我应该为每个Get,Put,Delete和POST创建Request类吗?
  2. 有没有更好的方法来验证授权?

2 个答案:

答案 0 :(得分:0)

您应该使用中间件并在路由中使用

library(spatstat)
X <- ppp(Particles$X, Particles$Y, c(0, imageSizeX), c(0, imageSizeY))
plot(density(X), xlim = c(1, imageSizeX), ylim = c(imageSizeY, 0))
plot(X, axes = TRUE, xlim = c(1, imageSizeX), ylim = c(imageSizeY, 0), add = T)
axis(1)
axis(2, las = 2)

或者您可以在每个控制器构造函数中使用

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

这样的管理中间件
public function __construct()
{
    $this->middleware('auth');
    $this->middleware('admin');
}

答案 1 :(得分:0)

对于动态角色我做这样的事情:

假设我有以下权限:

  1. 管理用户
  2. 管理CMS
  3. 管理酒店
  4. 管理包
  5. 管理角色
  6. 现在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中,以确保用户已登录并具有管理员角色。