仅当用户在 Laravel 5.7 中处于活动状态时才登录用户
Posted
技术标签:
【中文标题】仅当用户在 Laravel 5.7 中处于活动状态时才登录用户【英文标题】:Login a user only if his status is active in Laravel 5.7 【发布时间】:2019-05-15 18:53:42 【问题描述】:我是 Laravel 的新手,并且在实现用户身份验证方面相当成功。现在继续下一步,我必须只允许状态为活动的用户登录。为此,我添加了一个
status TINYINT
我的 mysql 用户表中的列。
我在 Laravel 文档中找到了这个:
指定附加条件
如果您愿意,您还可以在身份验证中添加额外的条件 查询除了用户的邮箱和密码。例如,我们 可以验证用户是否被标记为“活动”:
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) // The user is active, not suspended, and exists.
谁能指出我需要把这个块放在哪里。我彻底迷茫了,需要一些指点。
谢谢
【问题讨论】:
您目前如何验证用户身份? ***.com/questions/31015606/… @Jerodev 我正在使用 Laravel 的内置身份验证,并进行了一些更改(例如使用用户名而不是电子邮件,我认为它们不会产生任何后果)。 就像@MasivuyeCokile 所说的,这个链接上有很多解决方法:***.com/questions/31015606/… 【参考方案1】:在你的 LoginController 上有这个:
protected function credentials(Request $request)
return ['username' => $request->$this->username(), 'password' => $request->password, 'status' => 1];
【讨论】:
Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_RECOVERABLE_ERROR) Argument 1 passed to App\Http\Controllers\Auth\LoginController::credentials() must be an instance of App\Http\Controllers\Auth\Request, instance of Illuminate\Http\Request given, called in /Library/WebServer/Documents/transport/www/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php on line 81
我忘了包括use Illuminate\Http\Request;
为解决方案的简单性而接受。感谢和感谢【参考方案2】:
您只需获取用户状态并检查用户状态是真还是假。您可以使用身份验证会话中的 Auth::User()->status 获取状态。尝试这个。
if(Auth::attempt(['email'=>$request->email,'password'=>$request->password]))
$userStatus = Auth::User()->status;
if($userStatus=='1')
return redirect()->intended(url('/dashboard'));
else
Auth::logout();
Session::flush();
return redirect(url('login'))->withInput()->with('errorMsg','You are temporary blocked. please contact to admin');
else
return redirect(url('login'))->withInput()->with('errorMsg','Incorrect username or password. Please try again.');
【讨论】:
在哪里?在 Auth\LoginController 中? app\Http\Controllers\Auth\LoginController.php 您好 Jasim,您的代码的方法名称是什么?谢谢。【参考方案3】:只需将此代码放入您的App\Auth\LoginController
或您的LoginController
所在的其他位置。
public function authenticate(Request $request)
$credentials = $request->only('email', 'password');
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1]))
// Authentication passed...
return redirect()->intended('dashboard');
使用此代码,您将覆盖默认的 authenticate
函数
【讨论】:
我还没有尝试过,但您的回答似乎有道理。我唯一担心的是我将用户重定向到基于级别字段的不同仪表板。为此,我正在使用:public function redirectTo() $user = Auth::user(); $level = $user->level; if($level == 0) return '/home/super'; elseif($level == 1) return '/home/accountant'; else return '/home/branch';
如何处理此重定向?
如果您将其重定向到不同的位置,您可以将 protected $redirectTo = '/';
放在 LoginController 中。【参考方案4】:
将此添加到您的 LoginController:
protected function credentials(Request $request)
return [$this->username() => $request->$this->username(), 'password' => $request->password, 'active' => 1];
【讨论】:
【参考方案5】:在
中添加以下方法app\Http\Controllers\Auth\LoginController.php
它会扩展
AuthenticatesUsers 特征
validateLogin 方法。所以基本上,它也会检查你的活动条款。
protected function validateLogin(Request $request)
$this->validate($request, [
$this->username() => [
'required',
Rule::exists('users')->where(function ($query)
$query->where('active', 1);
),
],
'password' => 'required'
]);
或
将您需要的代码放入 app\Http\Controllers\Auth\LoginController.php
public function authenticate(Request $request)
if (Auth::attempt(['email' => $request->email, 'password' => $request->password, 'active' => 1]))
// The user is active, not suspended, and exists.
【讨论】:
【参考方案6】:您可以像这样覆盖 App\Http\Controllers\Auth\LoginController.php 中的 authenticated() 方法:
protected function authenticated(Request $request, $user)
if(!$user->active)
Auth::logout();
abort(403);
;
请注意这是快速但不是非常“Laravely”的解决方案。马虎。
【讨论】:
以上是关于仅当用户在 Laravel 5.7 中处于活动状态时才登录用户的主要内容,如果未能解决你的问题,请参考以下文章
当且仅当区域在 Emacs 中处于活动状态时,标记是不是处于活动状态?
Laravel 5.4 检查用户是不是处于活动状态,如果没有则回复消息
使用 Session ID 检查会话是不是处于活动状态 - Laravel