中间件不符合条件-Laravel 5.7

时间:2019-01-29 18:06:27

标签: php laravel laravel-5 laravel-authorization laravel-authentication

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

我有两个用户表-Admin(通过复制默认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

  

web.php

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

engineerController.php

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

我的理解是,仅当用户登录时才检查该条件,并在退出后在那里进行检查。

是否需要创建新的中间件以使授权页面保持完整?

我是一个自我学习者,是laravel的新手。我很确定自己没有遵循正确的做法。我开始尝试一些东西,直到完成为止。请指导我。

与此同时,请允许我如何做得更好。

1 个答案:

答案 0 :(得分: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']);
}