0

我正在尝试在遇到问题的 Laravel 5.7 中实现用户注册系统。

我有两个用户表 - 管理员(通过复制默认 Laravel 身份验证创建)、新路由、新的管理员中间件。使用警卫时,一切正常。

我试图通过添加批准/拒绝功能来限制用户登录。

我在 Users 表中添加了一个额外的列 - 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 时,我被定向到“/engineer”,而在其他情况下,我被定向到“批准”。

它可以按需要工作!

我现在面临的问题是,如果我尝试使用未经批准的用户访问“工程师”,我可以访问该页面。我不确定如何限制它。该页面仍然仅限于公开。

由于用户和管理员都可以访问控制器,因此我在控制器中使用了 __construct

网页.php

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

工程师控制器.php

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

我的理解是,仅在用户登录时以及退出后才检查该条件。

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

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

连同它,请让我怎样才能做得更好。

4

1 回答 1

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

最后,您也可以在 Controller 的构造函数中添加中间件。

public function __construct()
{
    $this->middleware(['auth:web','admin','engineer.approved']);
}
于 2019-01-30T07:19:49.983 回答