Промежуточное программное обеспечение не соответствует условию - Laravel 5.7 - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь внедрить систему регистрации пользователей в 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, я направлялся в '/ engineer', куда, как и в другом случае, меня направлялидо «одобрения».

Работает как надо !.

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

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

web.php

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

engineerController.php

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

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

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

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

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

1 Ответ

0 голосов
/ 30 января 2019

Вам необходимо определить промежуточное программное обеспечение, которое будет проверять, одобрен Инженер или нет.Очевидно, вам также необходимо сохранить это, например, в столбце 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']);
}
...