繁体   English   中英

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

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

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

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

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

我提到了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',
        ];
    }
}

问题:我应该删除Check in Request类吗? 这是一个不需要的验证来保护请求吗? 由于route.config已经在完成这项工作。

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

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

当你指定这个:

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

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

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

关于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方法中重复这些任务,但请记住,该方法的本机用途是授权特定请求

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM