2015-12-10 91 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); 
} 

現在工作得很好!