我正在尝试在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的新手。我很确定自己没有遵循正确的做法。我开始尝试一些东西,直到完成为止。请指导我。
与此同时,请允许我如何做得更好。
答案 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']);
}