Использование политики this-> gt; authorize () в контроллере laravel внутри метода store ()

Поэтому я читал об использовании политик laravel для предоставления прав доступа к ресурсам моего приложения, но там, похоже, возникла проблема, хотя я следовал руководству.

У меня есть пользовательская модель, которая не может быть создана с помощью HTTP-запросов, за исключением других пользователей, которые имеют вверять роль «Админ» или «Брокер». Я понял и смог заставить его работать над другими действиями, такими как индексация пользователей, было следующее:

Внутри AuthServiceProvider.php внутри частного $policies массив, я зарегистрировал этот класс пользователя с UserPolicy такой класс

class AuthServiceProvider extends ServiceProvider {

protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
User::class => UserPolicy::class,
Insured::class => InsuredPolicy::class
];

public function boot(GateContract $gate)
{
$this->registerPolicies($gate);
}
}

Определите класс контроллера UserPolicy:

class UserPolicy {

use HandlesAuthorization;

protected $user;

public function __construct(User $user) {
$this->user = $user;
}

public function index(User $user) {
$is_authorized = $user->hasRole('Admin');
return $is_authorized;
}

public function show(User $user, User $user_res) {

$is_authorized = ($user->id == $user_res->id);
return $is_authorized;
}

public function store() {
$is_authorized = $user->hasRole('Admin');
return $is_authorized;
}
}

Тогда внутри UserController класс, прежде чем выполнять критическое действие, которое я использую this->authorize() установите флажок, чтобы остановить или продолжить в зависимости от привилегий пользователя

class UserController extends Controller
{

public function index()
{
//temporary authentication here
$users = User::all();
$this->authorize('index', User::class);
return $users;
}

public function show($id)
{
$user = User::find($id);
$this->authorize('show', $user);
return $user;
}

public function store(Request $request) {$user = new User;
$user->name = $request->get('name');
$user->email = $request->get('email');
$user->password = \Hash::make($request->get('password'));

$this->authorize('store', User::class);

$user->save();

return $user;

}
}

Эта проблема в том, что $this->authorize() всегда останавливает процесс в действии хранилища, возвращая исключение: это действие не авторизовано.

Я пробовал несколько вариантов аргументов authorize () и не могу заставить его работать как действие index

4

Решение

В store() функция UserPolicy::class Вы не передаете объект модели User:

public function store(User $user) {
$is_authorized = $user->hasRole('Admin');
return true;
}

недостающий аргумент User $user,

Может быть, это причина проблемы.

1

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

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