2015-12-10 93 views
0

我正在使用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); 
    } 

正如你看到的,在authorize方法进行验证,以及代码的其余部分产生的结果。简单。

问题是因为如果我搜索(使用Administrator用户的所有情况)操作员用户,那么我所有的操作将被禁用:创建,删除,编辑等相同的行为,如果我搜索浏览器用户。

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

所以,我猜测的授权方法是接收用户发现!不是用户认证。我该如何解决这个问题?我传递User :: class是因为如果我没有通过任何传递,那么我的策略不起作用(因此,我在这里最后的注释https://laracasts.com/discuss/channels/laravel/laravel-511s-new-authorization-doesnt-read-policies/?page=2)。

谢谢。

回答

0

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

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

现在工作得很好!