Поэтому я читал об использовании политик 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
В store()
функция UserPolicy::class
Вы не передаете объект модели User:
public function store(User $user) {
$is_authorized = $user->hasRole('Admin');
return true;
}
недостающий аргумент User $user
,
Может быть, это причина проблемы.
Других решений пока нет …