Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Добрый день! Весь день сегодня ищу ошибку в своем коде. Дело в чем: есть таблицы с правами доступа многие ко многим. Хочу реализовать несколько видов пользователей.
Когда дело дошло до админ панели, то вычитав из документации стал использовать gate. Сначала прописал в файле AuthServiceProvider.php
protected $policies = [
'Corp\Model' => 'Corp\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Gate::define('VIEW_ADMIN', function(){
return false;
});
//
}
Далее в контроллере следующий код:
public function __construct(){
parent::__construct();
dd(Gate::denies('VIEW_ADMIN'));
if(Gate::denies('VIEW_ADMIN')){
abort(403);
}
$this->template = env('THEME').'.admin.index';
}
Весь день рылся на форумах и в документации, но так и не понял в чем проблема. Мне всегда
Gate::denies('VIEW_ADMIN')
возвращает TRUE, не зависимо, что я там пропишу. Что я делаю неправильно? Подскажите пожалуйста.
Изменено Foks (07.04.2019 23:51:51)
Не в сети
Конструктор контроллера неподходящее место для подобных проверок. Когда он выполняется, ещё много чего не инициализировано. Важные изменения произошли при переходе на v5.3, насколько я понял, поэтому старые примеры могут не работать.
https://github.com/laravel/framework/is … -283990768
Проверки надо выносить либо в методы либо в роут мидлваре.
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Вроде появилась надежда, но что-то не то. denies полностью отказывается работать. Я уже подумал, может я где-то написал русскую "с"
Попробовал и через модель и через посредник снизу код, ну хоть бы сдох, а он мне true.
Вот код через посредник, за имя класса и метода прошу прощения
Контроллер:
public function __construct(){
parent::__construct();
if(false){
abort(403);
}
$this->template = env('THEME').'.admin.index';
}
public function index(){
$this->title = 'Панель администратора';
return $this->renderOutput();
}
Посредник:
public function handle($request, Closure $next)
{
$this->prob();
return $next($request);
}
public function prob(){
dump(Gate::denies('VIEW_ADMIN'));
}
И провайдер:
public function boot()
{
$this->registerPolicies();
Gate::define('VIEW_ADMIN', function(){
return false;
});
//
}
Вот роут:
Route::group(['prefix' => 'admin', 'middleware' => ['auth', 'proverka'], 'as' => 'admin.'], function(){
Route::get('/', ['uses' => 'Admin\IndexController@index', 'as' => 'adminIndex']);
});
Если через модель, то просто сделал функцию в модели, вызвал эту функцию в методе index контроллера, но та же баллада. Не буду кодом засорять.
Также и просто в методе index контроллера попытался вывести, то же самое. Понял, что провайдер раньше проходит чем конструкт, а посредник позже.:D Как то не задумывался. Ту ссылку, которую скинули прочитал, уже года три назад с этим сталкивались. Документацию прочел, в апргейде просто написано "вызывайте это и это", а где вызывать. По сути везде вызываю, нигде не фурычит. Такое ощущение что метод фасада gate::define он просто не замечает, вывожу всякое предыдущей строчкой, все отображается до конструктора и посредника. Подумал еще, может не передаю что-то в функцию, залез в код, а там только первая переменная обязательная, так что вроде обращаюсь правильно.
Изменено Foks (09.04.2019 01:34:50)
Не в сети
На будущее пишу другим людям, столкнувшемся с данной проблемой. Как мне написали выше, что с обновлением нельзя теперь в конструкторе производить проверку. Далее я попытался произвести проверку в посреднике и модели и все равно не получалось. На самом деле получалось, это просто я, как оказалось лох. Я все время ждал, что метод denies мне вернет false, если при проверке в сервис провайдере вернется false, а он мне все время возвращал true, далее я менял метод на allows, и он мне возвращал всегда false. Суть в том (видимо я не внимательно прочитал документацию), что если ты используешь проверку с помощью метода denies, то этот метод возвращает true, если в самой проверке вернется false. Или если при проверке возвращается true, то denies возвращает false. А allows вернет то же, что возвращает define. Удачи всем.
Не в сети
Хоть я и не просчитал эту логическую ошибку, предупреждение о конструкторе остаётся в силе
Реальные а не сферические-в-вакууме разрешения на действие завязаны на идентифицированого пользователя. А идентификация недоступна в момент вызова конструктора. Следовательно гейту там не место.
Изменено artoodetoo (10.04.2019 06:22:35)
There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.
Не в сети
Страницы 1