我有一个包含users
的数据库表和一个名为status
的特定字段,它将具有三个值:
0
-对于已注册但在管理员将其状态更改为1之前没有访问权限的用户。
1
-对于已注册并批准的normal
用户。
2
-是admin
用户的状态。
所以现在我想让状态为1(normal
用户)和状态2(admin
用户)的用户登录,但是显然我无法使用添加到LoginController的此方法来执行此操作
我只能传递['status' => 1]
或['status' => 2]
,但不能同时传递两者,这将阻止用户或管理员登录。
有人可以帮助我吗?
protected function credentials(Request $request)
{
return array_merge($request->only($this->username(), 'password'),
(['status' => 1]) || (['status' => 2]));
}
谢谢。
答案 0 :(得分:1)
这是一个解决方案,可以解决您的登录问题,并保护您的路线免遭未经授权的用户的直接访问。如果您只想阻止实际的登录,请参阅@thefallen的其他答案。但是,如果除了登录表单之外还需要进一步的保护,则可以将所有受保护的路由包装在中间件中,该中间件检查用户的“状态”是否等于1或2。如果不是,则可以记录它们出来。这实际上并不会阻止他们在前端登录,但是可以确保未经批准的用户无法访问受保护的路由,并且在登录时会立即注销。假设您在用户登录时将他们重定向到受保护的路由,则中间件将根据该第一个请求将他们直接注销。中间件可能看起来像这样:
class AuthorizedUser
{
public function handle($request, Closure $next)
{
if(Auth::check() && !in_array(Auth::user()->status, [1, 2])) {
Auth::logout();
abort(404);
} else if(Auth::check()) {
return $next($request);
} else {
abort(404);
}
}
}
然后,您可以使用$ middelwareGroups数组在此中间件中包装受保护的路由,在Http \ Kernel.php文件中类似以下内容:
protected $middlewareGroups = [
'authorized' => [
\App\Http\Middleware\AuthorizedUser::class,
]
];
您可以将404功能更改为所需的功能,例如重定向回登录页面或主页。
答案 1 :(得分:0)
最简单的方法是覆盖LoginController中的 authenticated()方法,该方法将在用户成功登录后执行:
protected function authenticated(Request $request, $user)
{
if (in_array($user->status, [1, 2])) {
return redirect()->intended($this->redirectPath());
}
auth()->logout();
return redirect('/login')->withErrors(['email' => 'You can not login.']);
}
这样,您可以检查用户状态是否正确,如果没有,则可以注销并重定向并显示错误消息。不要忘记在顶部导入use Illuminate\Http\Request;
。
如果您需要另一种解决方案,可以在尝试登录之前实际检查用户状态,则默认方法会有很多更改。