授权不适用于用户搜索

Posted

技术标签:

【中文标题】授权不适用于用户搜索【英文标题】:Authorization not working for Users Search 【发布时间】:2015-12-10 20:50:00 【问题描述】:

我正在使用 Laravel 5.1.26,包括带有策略的授权。我有一个基本的 ACL 模型,其中用户有一个角色,当然还有一个整数角色字段。

我的角色是: 0 - 管理员(可以对用户执行任何操作); 1-操作员(不能对用户进行任何操作); 2- 查看器(不能对用户执行任何操作)。

我提供执行用户搜索的选项。由于我的角色定义,只有管理员可以执行此操作。所以,我在 UserController 中有一个方法来显示我的结果:

public function postSearch(Request $request)
    
        $this->authorize('search', User::class);
        $query = User::select('name', 'email')
                    ->where('name', 'LIKE', "%$request->name%")
                    ->where('email', 'LIKE', "%$request->email%")
                    ->where('role', '=', "%$request->role%");
        return $this->displayResult($query, $request);
    

如您所见,授权方法执行验证,其余代码创建结果。简单的。

问题是因为如果我搜索(在所有情况下都使用管理员用户)操作员用户,那么我的所有操作都将被禁用:创建、删除、编辑等。如果我搜索相同的行为对于查看器用户。

但如果我搜索管理员用户,那么我的所有操作都已启用!

所以,我猜想授权方法是接收用户找到的!未经过身份验证的用户。我该如何解决这个问题?我通过了 User::class 因为如果我不通过任何东西,那么我的策略就不起作用(因此,我遵循了这里的最后一条评论 https://laracasts.com/discuss/channels/laravel/laravel-511s-new-authorization-doesnt-read-policies/?page=2)。

谢谢。

【问题讨论】:

【参考方案1】:

在我的应用程序上执行另一个 Search 选项后,我发现 Eloquent 与平时有点不同,我在我的模型上创建了一个 Search 方法。基本上执行此操作:

public function scopeSearch($query, $field, $value)
    
        if(is_numeric($value))
            return $query->where($field, '=', "$value");
        else
            return $query;
    

所以,我把原来的代码改成了这个,我的角色是一个整数:

public function postSearch(Request $request)
    
        $this->authorize('search', User::class);
        $query = User::select('name', 'email')
                    ->where('name', 'LIKE', "%$request->name%")
                    ->where('email', 'LIKE', "%$request->email%")
                    ->search('role', "$request->role");
        return $this->displayResult($query, $request);

现在可以正常工作了!

【讨论】:

以上是关于授权不适用于用户搜索的主要内容,如果未能解决你的问题,请参考以下文章

授权标头不适用于 cors [关闭]

自定义授权适用于操作级别,但不适用于控制器级别

Phonegap - iOS 文件传输不适用于授权标头

通过注释的 Spring 授权不适用于自定义身份验证

使用标头参数的邮递员授权工作但不适用于 Axios 标头

Axios 发布请求适用于 Postman,但不适用于浏览器(它返回“错误 401-未授权”)