我正在使用php laravel为我的管理控制台创建身份验证(具有eloquent的默认身份验证方法)。
为此,我有两个表,其中一个用于存储基本用户详细信息,如用户名,密码,名称,重试次数,状态等。另一个用户角色映射。
我想要实现的目标
块引用 这是我尝试运行身份验证的SQL查询
SELECT * FROM users WHERE username = '' AND password = '' AND status = 1 AND retry_count < 3;
如果登录失败,
用户成功通过身份验证后,
表
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(25) CHARACTER SET utf8 NOT NULL UNIQUE,
`password` varchar(255) CHARACTER SET utf8 NOT NULL,
`name` varchar(255) CHARACTER SET utf8 NOT NULL,
`status` int(11) NOT NULL,
`retry_count` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
);
CREATE TABLE `user_role_mapping` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`role_id` int(11) NOT NULL,
`status` int(11) NOT NULL,
PRIMARY KEY (`id`)
);
块引用 user_role_mapping.user_id是users.id的外键。而user_role_mapping可以为同一个用户提供多行。
我已经完成了如下登录身份验证的基础知识,它可以正常工作。但是我为了达到上述4个用例而被困在这里。
public function submitLogin(Request $request)
{
$this->validate($request, [
'username'=>'required|max:50',
'password'=>'required|max:100',
]);
if (Auth::attempt(['username' => $request->username, 'password' => $request->password, 'status' => 1])) {
//return [Auth::user() , Auth::id()];
return redirect()->intended(route('home'));
}
return redirect()->back()
->withInput($request->only('username', 'remember'))
->withErrors([
'Invalid Username or password.',
]);
}
提前致谢..
答案 0 :(得分:0)
请查看有关额外字段验证的post。
&#34;重试次数&#34;包含在laravel中,检查ThrottlesLogins.php,它处理重试计数并清除成功的计数。
如果登录失败。查看官方doc有关错误消息的信息。你可以用刀片这样做:
<input type="email" name="email" value="{{ old('email') }}" required>
@if ($errors->has('email'))
<span class="help-block">
<strong>{{ $errors->first('email') }}</strong>
</span>
@endif
Laravel会将电子邮件的错误覆盖到&#34;登录尝试次数过多。请在XX秒后再试一次。&#34;如果尝试次数太多(默认为5),则显示消息。
在AuthenticateUsers.php中验证的函数中对用户进行身份验证后,您可以实现自己的操作(例如:向会话添加更多信息)(名称约定基于laravel 5.5,不检查名称是否为与以前的版本不同。)
**对于已登录用户的角色更改,请注意安全问题。
/**
* The user has been authenticated.
*
* @param \Illuminate\Http\Request $request
* @param mixed $user
* @return mixed
*/
protected function authenticated(Request $request, $user)
{
//below is an exmaple
$u = User::with('roles')->find($user->id);
if(isset($u->roles)) {
foreach($u->roles as $role) {
session()->put('user.roles.'$role, true);
}
}
}
由于laravel为已注销用户清除(无效)所有会话,因此您的第4个问题并不重要。您可以在AuthenticateUsers.php
中查看功能注销public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->invalidate();
return redirect('/');
}
更新:来自所有IP的帐户的节流
如登录功能中所述,Laravel使用用户名和IP来键入缓存和值以进行计数。所以,乍一看我会说你正在寻找ThrottlesLogins.php中的函数throttleKey。
protected function throttleKey(Request $request)
{
return Str::lower($request->input($this->username())).'|'.$request->ip();
}
带走。&#39; |&#39;。$ request-&gt; ip()对所有尝试登录的IP进行全局检查。这是一个未经测试的建议,您可能需要做更多的事情来满足您的需求。
更新:验证登录的额外字段
在AuthenticatesUsers.php中查看函数attemptLogin(这是针对v5.5)
以下是一个示例,但需要进行测试:
/**
* Attempt to log the user into the application.
*
* @param \Illuminate\Http\Request $request
* @return bool
*/
protected function attemptLogin(Request $request)
{
$credentials = array_add($this->credentials($request), 'status', '1');
return $this->guard()->attempt(
$credentials, $request->has('remember')
);
}
将此与doc进行比较,您将找到该模式。它与:
相同if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) {
// The user is active, not suspended, and exists.
}