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

时间:2016-05-12 10:36:42

标签: php laravel laravel-5 laravel-5.2

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

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

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

我提到了2 Middlewares

  
      
  1. Auth Middleware:这是authentication
  2.   
  3. SuperAdmin Middleware:这适用于Authorization
  4.   

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

中进行了检查
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?

1 个答案:

答案 0 :(得分:5)

是的,您应该删除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方法对特定请求进行授权检查。

例如,从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));
} 

总之:如果您在中间件中执行身份验证和授权任务,则无需在authorize方法中重复这些任务,但请记住,该方法的本机用途是授权具体要求