如何在 Laravel 5 中登录时检查用户状态?
Posted
技术标签:
【中文标题】如何在 Laravel 5 中登录时检查用户状态?【英文标题】:How to check user status while login in Laravel 5? 【发布时间】:2017-02-06 23:09:48 【问题描述】:我使用了 Laravel 身份验证(快速入门)。但我需要检查用户的状态(已批准/待定)。如果未获批准,则登录页面中将显示错误。我需要知道我必须在哪个文件中进行更改以及更改是什么。目前我正在开发 Laravel 5.3。
【问题讨论】:
【参考方案1】:您可以创建Laravel Middleware,查看链接了解更多信息
php artisan make:middleware CheckStatus
修改你的中间件以获得
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class CheckStatus
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
$response = $next($request);
//If the status is not approved redirect to login
if(Auth::check() && Auth::user()->status_field != 'approved')
Auth::logout();
return redirect('/login')->with('erro_login', 'Your error text');
return $response;
然后将你的中间件添加到你的 Kernel.php
'checkstatus' => \App\Http\Middleware\CheckStatus::class,
最后将中间件添加到您的路由中
Route::post('/login', [
'uses' => 'Auth\AuthController@login',
'middleware' => 'checkstatus',
]);
希望对你有帮助
【讨论】:
如何在我的路由中添加中间件,因为web.php中没有这样的路由? @Efaz 检查this 以覆盖您的Auth::routes();
如果您还想使用标准会话消息机制在登录页面中显示描述性消息,则此方法不可行,因为 return redirect()->route('login')->withErrors([ 'error' => 'blablabla' ])
不会正确设置错误消息重定向之前的会话。那里有一些东西让我发疯并且无法解决。如果您还想要自定义错误消息,我推荐下面的 authenticated() 方法。【参考方案2】:
我为此找到了一个简单的解决方案。 Artisan 创建App\Http\Controllers\Auth\LoginController
,如果您有一些登录条件,只需在此默认控制器中添加此代码,例如我有一个字段state
,您可能有status, email_status
或其他。
// Custom code for Auth process
protected function credentials( Request $request )
$credentials = $request->only($this->username(), 'password');
$credentials['state'] = 1;
return $credentials;
【讨论】:
【参考方案3】:只需在我的 LoginController 中添加以下方法就可以了
protected function authenticated(Request $request, $user)
if ($user->yourFirldName != "Active")
Auth::logout();
return redirect('/login')->with('error', 'Looks Like Your status is InActive');
【讨论】:
我认为这是要走的路!我会将with(...)
更改为withErrors([ 'error' => 'something' ])->withInput()
以在登录页面中正确显示原因。【参考方案4】:
上面的答案救了我
if (Auth::attempt(['email'=>$input['email'],'password'=>$input['password'], 'user_status'=>1 ]))
这将检查状态
【讨论】:
【参考方案5】:我不同意楼上的回答,这会导致你的应用性能很低,也不建议修改 Laravel 的源代码。
因此您可以像这样将 getCredentials 函数重写到您的 app\Http\Controllers\Auth\AuthController.php 文件中:
<?php
//app\Http\Controllers\Auth\AuthController.php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
use Illuminate\Http\Request;
class AuthController extends Controller
use AuthenticatesAndRegistersUsers, ThrottlesLogins;
//you need add this function
protected function getCredentials(Request $request)
$data = $request->only($this->loginUsername(), 'password');
$data['is_approved'] = 1;
return $data;
那么你就可以直接使用 Laravel Authentication (Quickstart) 了。
希望这会有所帮助。
【讨论】:
【参考方案6】:固定答案是最好的方法。
请注意:如果您使用的是 Laravel 5.8+,则需要使用:
//Default Auth routes
Auth::routes();
//Override and add middleware
Route::post('/login', [
'uses' => 'Auth\LoginController@login',
'middleware' => 'checkstatus',
]);
【讨论】:
【参考方案7】:按照步骤...
首先在你的用户表中添加一列(假设 is_approved)
在 App/Http/Controllers/Auth/LoginController 文件中
public function authenticate()
if (Auth::attempt(['email' => $email, 'password' => $password, 'is_approved'=>1]))
// Authentication passed...
return redirect()->intended('dashboard');
希望这会有所帮助
【讨论】:
【参考方案8】:public function login(Request $request)
if ($request->isMethod('post'))
$data= $request->all();
$roles=[
'email' => 'required|email|max:255',
'password' => 'required',
];
$customessage=[
'email.required' =>'Email is required',
'email.email' => 'Email is not vaild',
'password.required' => 'Password is required',
];
$this->validate($request,$roles,$customessage);
if(Auth::guard('admin')->attempt(['email'=>$data['email'],'password'=>$data['password'],'status'=>1]))
return redirect('admin/dashboard');
else
Session::flash('error_message','You are not Active by Admin');
return redirect()->back();
return view('admin.admin_login');
【讨论】:
以上是关于如何在 Laravel 5 中登录时检查用户状态?的主要内容,如果未能解决你的问题,请参考以下文章
Laravel 5.8 JWT API 仅在用户状态为活动时登录用户
仅当用户在 Laravel 5.7 中处于活动状态时才登录用户
如何仅检查(状态)活动用户可以登录-JWT Auth-Laravel