允许其他用户使用laravel登录

时间:2018-09-18 14:13:21

标签: php laravel-5

我有一个包含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]));
    }

谢谢。

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;

如果您需要另一种解决方案,可以在尝试登录之前实际检查用户状态,则默认方法会有很多更改。

相关问题