Laravel中的Request类中的authorize方法的目的是什么?

Pan*_*kaj 8 php laravel laravel-5 laravel-5.2

今天,我对我的网站安全以及为使网站安全而编写的一些额外代码感到有些困惑。以下是应用安全性的2个位置。

在Route Config中,为了保护路由,我使用了中间件来检查用户角色。

Route::group(['middleware' => ['web', 'SuperAdmin', 'auth']], function () {
    Route::get('/Create-Department', 'DepartmentController@CreateDepartment');
});
Run Code Online (Sandbox Code Playgroud)

我提到了2 Middlewares。

  1. Auth Middleware :这是为了authentication。
  2. SuperAdmin Middleware:这是为了Authorization。

第二个位置是请求类。这是代码。在授权方法中,再次检查与在路径中已做的相同的事情

class DepartmentRequest extends Request
{
    public function authorize()
    {
        if(\Auth::user() == null) {
            return false;
        }
        if(\Auth::user()->isSuperAdmin()) {
            return true;
        }
        return false;
    }

    public function rules()
    {
        return [
            'Department' => 'required',
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

问题:我应该删除请求类中的支票吗?这是确保请求安全的有害验证吗?由于route.config已经在做这项工作。

授权方法有什么用?我的意思是,我正在使用Request类来验证表单输入。我应该始终从授权方法返回true吗?

Mop*_*ppo 6

是的,您应该删除Request该类中的检查:如果您已经在中间件中进行了检查,则不应重复这些检查

当您指定此:

Route::group(['middleware' => ['web', 'SuperAdmin']], function () {
    Route::get('/Create-Department', 'DepartmentController@CreateDepartment');
});
Run Code Online (Sandbox Code Playgroud)

您告诉laravel,当它找到/Create-Department路由时,应该触发handle这些中间件的方法:['web', 'SuperAdmin'],然后才将请求发送到DepartmentController

因此,如果您在中间件中检查身份验证和授权,则当请求到达您的控制器时,您确定它已经满足了它通过的所有中间件的要求。

关于authorize方法的目的:authorize方法通常用于根据您希望遵守的某些策略对实际请求进行授权。例如,如果您有请求编辑帖子模型的请求,则在该authorize方法中,您将检查尝试编辑帖子的特定用户是否具有执行该帖子的权限(例如,作为帖子的作者)

编辑

即使您想使用中间件进行授权,也可以。无论如何,通常authorize使用表单请求中的方法对特定请求进行授权检查。

例如,从docs检查以下示例:

public function authorize()
{
    $postId = $this->route('post');

    //here the authorization to edit the post is checked through the Gate facade
    return Gate::allows('update', Post::findOrFail($postId));
} 
Run Code Online (Sandbox Code Playgroud)

结论:如果您正在中间件中执行身份验证和授权任务,则无需在authorize方法中重复它们,但是请记住,该方法的本机目的是授权特定请求