Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 07.04.2019 23:48:15

Gate define и denies

Добрый день! Весь день сегодня ищу ошибку в своем коде. Дело в чем: есть таблицы с правами доступа многие ко многим. Хочу реализовать несколько видов пользователей.
Когда дело дошло до админ панели, то вычитав из документации стал использовать 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)

Не в сети

#2 08.04.2019 16:33:10

Re: Gate define и denies

Конструктор контроллера неподходящее место для подобных проверок. Когда он выполняется, ещё много чего не инициализировано. Важные изменения произошли при переходе на 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.

Не в сети

#3 09.04.2019 01:23:04

Re: Gate define и denies

Вроде появилась надежда, но что-то не то. denies полностью отказывается работать. Я уже подумал, может я где-то написал русскую "с" smile
Попробовал и через модель и через посредник снизу код, ну хоть бы сдох, а он мне true.
Вот код через посредник, за имя класса и метода прошу прощения smile

Контроллер:

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)

Не в сети

#4 09.04.2019 20:58:56

Re: Gate define и denies

На будущее пишу другим людям, столкнувшемся с данной проблемой. Как мне написали выше, что с обновлением нельзя теперь в конструкторе производить проверку. Далее я попытался произвести проверку в посреднике и модели и все равно не получалось. На самом деле получалось, это просто я, как оказалось лох. Я все время ждал, что метод denies мне вернет false, если при проверке в сервис провайдере вернется false, а он мне все время возвращал true, далее я менял метод на allows, и он мне возвращал всегда false. Суть в том (видимо я не внимательно прочитал документацию), что если ты используешь проверку с помощью метода denies, то этот метод возвращает true, если в самой проверке вернется false. Или если при проверке возвращается true, то denies возвращает false. А allows вернет то же, что возвращает define. Удачи всем.

Не в сети

#5 10.04.2019 06:14:47

Re: Gate define и denies

Хоть я и не просчитал эту логическую ошибку, предупреждение о конструкторе остаётся в силе smile

Реальные а не сферические-в-вакууме разрешения на действие завязаны на идентифицированого пользователя. А идентификация недоступна в момент вызова конструктора. Следовательно гейту там не место.

Изменено artoodetoo (10.04.2019 06:22:35)


There are two hard things in computer science: cache invalidation, naming things, and off-by-one errors.

Не в сети

Подвал раздела