中间件不符合条件 - Laravel 5.7

Middleware not following the condition - Laravel 5.7

我正在尝试在 Laravel 5.7 中实施用户注册系统,但我遇到了问题。

我有两个 table 用于用户-管理员(通过复制默认 Laravel 授权创建), 新路由,新的管理员中间件。使用守卫时一切正常。

我试图通过添加 Approve/Disapprove 功能来限制用户登录。

我向用户 table 添加了一个额外的列 - admin(boolean)。

在登录控制器 - 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 时,我被定向到“/工程师”,而在其他情况下,我被定向到 'approval'。

如愿以偿!

我现在面临的问题是,如果我尝试访问 'engineer' 使用未经批准的用户我可以访问该页面。我不确定如何限制它。该页面仍然限制在 public.

由于controller会被user和admin访问,所以我在controller中使用了__construct

web.php

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

engineerController.php

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

我的理解是,只有在用户登录和退出后才会检查条件。

是否需要创建一个新的中间件来保持授权页面的完整性?

我是一名自学者,也是 laravel 的新手。我很确定我没有遵循正确的做法。我开始了一些事情,并试图跟随它直到完成。请指导我完成它。

伴随着它,请让我如何做得更好。

您需要定义一个中间件来检查工程师是否获得批准。 显然,例如,您还需要将其保存在 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']);
}