Промежуточное программное обеспечение не соответствует условию - Laravel 5.7

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

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

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

Я добавил дополнительный столбец - admin (логическое значение) в таблицу 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 в контроллере

web.php

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

engineerController.php

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

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

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

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

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

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,
];

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

public function __construct()
{
    $this->middleware(['auth:web','admin','engineer.approved']);
}
Другие вопросы по тегам