Промежуточное программное обеспечение не соответствует условию - 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']);
}