Промежуточное ПО не соответствует условию - Laravel 5.7

Я пытаюсь внедрить систему регистрации пользователей в Laravel 5.7, где столкнулся с проблемой.

У меня есть две таблицы для пользователей — администратора (созданные путем копирования аутентификации Laravel по умолчанию), новые маршруты, новое промежуточное программное обеспечение для администратора. Все работает нормально при использовании охранников.

Я пытался ограничить вход пользователя в систему, добавив функцию одобрения/отклонения.

Я добавил дополнительный столбец - admin(boolean) в таблицу Users.

В контроллере входа в систему - страница LoginController.php я добавил

  protected function authenticated($request, $user)
    {
        if ( $request->user()->admin != 1)
        // if($user->admin != 1)
        {
            return redirect()->route('approval');
        }
        else
        {
            return redirect('/engineer');
        }
    }

так что, когда администратор равен 1, я перенаправляюсь на «/ инженер», где, как и в других случаях, я перенаправляюсь на «одобрение».

Он работает как хотелось!.

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

Поскольку к контроллеру будут обращаться как пользователь, так и администратор, я использовал __construct в контроллере.

веб.php

Route::resource('engineer', 'engineerController');

инженерконтроллер.php

public function __construct()
        {
            $this->middleware('auth:web,admin');
        }

Насколько я понимаю, условие проверяется только тогда, когда пользователь входит в систему и после его выхода.

Нужно ли мне создавать новое промежуточное ПО, чтобы авторизованная страница оставалась нетронутой?

Я самоучка и новичок в laravel. Я почти уверен, что не следую правильной практике. Я что-то начал и пытался следовать этому, пока не закончу. Пожалуйста, проведите меня через это.

Наряду с этим, пожалуйста, дайте мне, как я мог бы сделать это лучше.


person mightyteja    schedule 29.01.2019    source источник


Ответы (1)


Вам нужно будет определить промежуточное программное обеспечение, которое будет проверять, одобрен ли инженер или нет. Очевидно, вам также нужно будет сохранить это, например, в столбце is_approved.

<?php

namespace App\Http\Middleware;

use Closure;

class CheckEngineerApproval
{
    /**
    * Handle an incoming request.
    *
    * @param  \Illuminate\Http\Request  $request
    * @param  \Closure  $next
    * @return mixed
    */
    public function handle($request, Closure $next)
    {
        if (! auth()->user->is_approved) {
            return redirect('user.approve');
        }

        return $next($request);
    }
}

Затем добавьте его в массив $routeMiddleware в ядре.

protected $routeMiddleware = [
    // 
    //
    'engineer.approved' => \App\Http\Middleware\CheckEngineerApproval::class,
];

Наконец, вы также можете добавить промежуточное ПО в конструктор вашего контроллера.

public function __construct()
{
    $this->middleware(['auth:web','admin','engineer.approved']);
}
person Mozammil    schedule 30.01.2019
comment
Большое спасибо за ваш ответ, у меня есть сомнения при добавлении этой публичной функции __construct() { $this-›middleware('auth:web,admin,engineer.approved'); } 'web', по умолчанию разрешить пользователям доступ к странице rgt?. Когда я пытаюсь удалить сеть, я получаю, что защита авторизации [engineer.approved] не определена. Это только мое понимание, поправьте меня, если я ошибаюсь - person mightyteja; 30.01.2019
comment
auth:web означает, что пользователю необходимо авторизоваться для доступа к странице. - person Mozammil; 30.01.2019
comment
Также $this->middleware() принимает массив промежуточного программного обеспечения. Я обновил конструктор. - person Mozammil; 30.01.2019
comment
Я изменил конструктор на public function __construct() { $this-›middleware(['auth:web,admin','engineer.approved']); } по-прежнему страница не перенаправляется - person mightyteja; 30.01.2019
comment
Не могли бы вы dd(auth()->user->is_approved) в промежуточном программном обеспечении и сообщить нам результат? - person Mozammil; 30.01.2019
comment
Не беспокойся, Мозаммил, я понял, в чем проблема!! Большое спасибо за оперативный ответ. Я серьезно. Проблема была с if (! auth()-›user-›is_approved) {} ​​в промежуточном программном обеспечении, я обновил его до if ( auth()-›user-›is_approved) {}. Теперь он перенаправляет страницу обратно. Еще раз большое спасибо. Я обновлю ответ для вас. - person mightyteja; 30.01.2019