授权不适用于用户搜索

时间:2015-12-10 20:50:00

标签: php authorization laravel-5.1 policy

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

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

我提供了执行用户搜索的选项。只有管​​理员可以执行此操作,因为我的角色定义。所以,我在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);
    }

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

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

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

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

感谢。

1 个答案:

答案 0 :(得分:0)

在我的应用程序上执行了另一个搜索选项之后,我发现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);
}

现在工作正常!