Авторизация не работает для поиска пользователей

Я использую 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 выполняет проверку, а остальной код создает результат. Просто.

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

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

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]