Laravel中Request类中authorize方法的用途是什么


What is the purpose of the authorize method in a Request class in Laravel?

我今天对我的网站安全性和一些为确保网站安全而编写的额外代码有点困惑。以下是应用安全措施的两个位置。

在路由配置内部,为了确保路由的安全,我使用了中间件来检查用户角色

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

我提到2 Middlewares

  1. Auth Middleware:这是给authentication
  2. SuperAdmin Middleware:这是给Authorization

第二个位置是Request类。这是代码。在授权方法中,再次检查与路由中已经完成的相同的事情

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',
        ];
    }
}

问题:我应该删除请求类中的签入吗?这是为了确保请求安全而进行的不必要的验证吗?由于route.config已经在做这项工作。

authorize方法有什么用?我的意思是,我使用Request类来验证表单输入。我应该总是从authorize方法返回true吗

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

当您指定此项时:

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

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

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

关于authorize方法的用途:authorize方法通常用于根据您希望遵守的一些策略对实际请求进行授权。例如,如果你有一个编辑Post模型的请求,在authorize方法中,你会检查试图编辑帖子的特定用户是否有权限(例如,作为帖子的作者)

编辑

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

例如,从文档中查看此示例:

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

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