2015-12-10 5 views
0

Я использую 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); 
    } 

Как вы видите, метод авторизированного выполнить проверку, а остальная часть коды создает результат. Просто.

Проблема в том, что если при поиске (с помощью пользователя администратора для всех случаев) для пользователя оператора, то все мои операции отключены: создавать, удалять, редактировать и т.д. То же поведение, если при поиске пользователь просмотра ,

Но если я ищу пользователя Administrator, то все мои операции будут включены!

Итак, я предполагаю, что метод авторизации получает найденный пользователь! Пользователь не аутентифицирован. Как я могу это решить? Я передаю класс User ::, потому что, если я ничего не пропускаю, мои политики не работают (поэтому я следил за последним комментарием здесь 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); 
} 

теперь работает отлично!