仅当用户在 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

Laravel - 检查帐户是不是处于活动状态

Laravel 身份验证在 laravel 5.3 中无法正常工作

javascript:仅当父元素处于活动状态且子元素具有特定类时,如何向子元素添加属性?