如何在 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()-&gt;route('login')-&gt;withErrors([ 'error' =&gt; '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' =&gt; 'something' ])-&gt;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

Laravel 5.4 检查用户是不是处于活动状态,如果没有则回复消息

检查“其他”用户是不是使用 Laravel 5 登录/注销

想修改 laravel 默认登录来检查用户是不是被验证