【问题标题】:What is the purpose of the authorize method in a Request class in Laravel?Laravel 的 Request 类中的 authorize 方法的目的是什么?
【发布时间】:2016-09-08 03:23:21
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: php laravel laravel-5 laravel-5.2


    【解决方案1】:

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

    当您指定时:

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

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

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

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

    总结:如果你在中间件中做你的认证和授权任务,你不需要在authorize方法中重复它们,但请记住,该方法的原生目的是授权特定的请求

    【讨论】:

    • authorize方法有什么用?我的意思是,我正在使用Request 类来验证表单输入。我应该总是从 authorize 方法返回 true 吗?
    • 我提到了 2 Middlewares。 1.Auth Middleware:这是给authentication的。 2.IsAdmin Middleware。这是给Authorization的。
    • 作为附加,从您的路由中删除您的 web 中间件,因为它在最新版本中自动调用。详情请看here
    • @Moppo:你能在这里提出一些建议吗:stackoverflow.com/questions/37330253/…
    猜你喜欢
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 2018-04-28
    • 1970-01-01
    • 2018-02-24
    • 2011-07-31
    相关资源
    最近更新 更多