将 laravel 5 内置身份验证扩展为仅登录“如果用户 == 活动”

Posted

技术标签:

【中文标题】将 laravel 5 内置身份验证扩展为仅登录“如果用户 == 活动”【英文标题】:extend laravel 5 built-in authentication to login only "if user == active" 【发布时间】:2015-09-23 12:50:23 【问题描述】:

我使用 laravel 5.1.6 包含的身份验证,想知道如何扩展它,像这样工作:

if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1])) 
    // The user is active, not suspended, and exists.

如果用户不是“活跃的”,那么登录应该是不可能的。我在 users 表中有一个“活动”列,值为 0 或 1。我如何在仍然使用带有登录限制的内置身份验证的同时做到这一点。

编辑:

我在 AuthController 中没有 postLogin 函数,只有 use AuthenticatesAndRegistersUsers, ThrottlesLogins;__construct()validator()create() 函数。我是否必须更改 Illuminate\Foundation\Auth\.. 的特征中的某些内容,还是必须在 AuthController 中添加 postLogin() 函数?

【问题讨论】:

Login only if user is active using Laravel的可能重复 postLogin 函数在AuthenticatesAndRegistersUsers trait 中定义,但您可以通过在AuthController 中复制它来覆盖它,然后您可以对其进行修改。 AuthController 使用来自AuthenticatesAndRegistersUserspostLogin 函数。您需要通过在 AuthController 中放置一个新的 postLogin 函数来覆盖该函数。看看我在之前评论中链接的问题。 【参考方案1】:

已解决:此链接(教程)将对您有所帮助:https://medium.com/@mshanak/solved-tutorial-laravel-5-3-disable-enable-block-user-login-web-passport-oauth-4bfb74b0c810

第一步:

add new field to the User table called ‘status’ (1:enabled, 0:disabed)

第二步:

to block the web login , in app/Http/Controllers/Auth/LoginController.php add the follwoing function:

/**
 * Get the needed authorization credentials from the request.
 *
 * @param \Illuminate\Http\Request $request
 * @return array
 */
 protected function credentials(\Illuminate\Http\Request $request)
 
 $credentials = $request->only($this->username(), ‘password’);

return array_add($credentials, ‘status’, ‘1’);
 

第三步:

to block the user when using passport authentication ( token ) , in the User.php model add the following function :

public function findForPassport($identifier) 
     return User::orWhere(‘email’, $identifier)->where(‘status’, 1)->first();
     

完成:)

【讨论】:

【参考方案2】:

在 Laravel 上 5.3.* 更新 app/Http/Controllers/Auth/LoginController

class LoginController extends Controller


    use AuthenticatesUsers;

    /**
     * Get the needed authorization credentials from the request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return array
     */
    protected function credentials(\Illuminate\Http\Request $request)
    
        $credentials = $request->only($this->username(), 'password');

        return array_add($credentials, 'active', '1');
    

    // your code here

【讨论】:

我们如何显示“它处于活动状态”的错误?谢谢【参考方案3】:

您可以在 AuthController 中覆盖 getCredentials() 方法:

class AuthController extends Controller

    use AuthenticatesAndRegistersUsers;

    public function getCredentials($request)
    
        $credentials = $request->only($this->loginUsername(), 'password');

        return array_add($credentials, 'active', '1');
    

这将在尝试对用户进行身份验证时添加active = 1 约束。

编辑:如果你想要一个单独的错误消息,如 BrokenBinary 所说,那么 Laravel 允许你定义一个名为 authenticated 的方法,该方法在用户通过身份验证之后调用,但在重定向,允许您进行任何登录后处理。因此,您可以通过检查经过身份验证的用户是否处于活动状态来利用它,如果不是,则抛出异常或显示错误消息:

class AuthController extends Controller

    use AuthenticatesAndRegistersUsers;

    public function authenticated(Request $request, User $user)
    
        if ($user->active) 
            return redirect()->intended($this->redirectPath());
         else 
            // Raise exception, or redirect with error saying account is not active
        
    

别忘了导入Request 类和User 模型类。

【讨论】:

如果非活动用户尝试登录,他们将收到与电子邮件/密码不匹配时相同的“凭据无效”错误消息。您真的应该告诉用户他们未能登录,因为他们的帐户处于非活动状态。 我有这个authenticated 方法..但它没有被调用..有什么帮助吗? 当使用authenticated 方法时,请记住此时用户实际上已经通过了身份验证。因此,如果他与您的 $user->active 检查不匹配,您将不得不手动将他注销。 (在重定向或抛出异常之前)【参考方案4】:

我现在已经更改了身份验证中间件/app/Http/Middleware/Authenticate.php(在评论下方添加了块):

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)

    if ($this->auth->guest())
    
        if ($request->ajax())
        
            return response('Unauthorized.', 401);
        
        else
        
            return redirect()->guest('auth/login');
        
    

    #logout if user not active
    if($this->auth->check() && $this->auth->user()->active !== 1)
        $this->auth->logout();
        return redirect('auth/login')->withErrors('sorry, this user account is deactivated');
    

    return $next($request);

似乎,如果他们已经登录,它也会注销非活动用户。

【讨论】:

【参考方案5】:

我会在postLogin() 函数中添加以下第一件事。

       $this->validate($request, [
            'email' => 'required|email', 'password' => 'required',
        ]);

        if ($this->auth->validate(['email' => $request->email, 'password' => $request->password, 'active' => 0])) 
            return redirect($this->loginPath())
                ->withInput($request->only('email', 'remember'))
                ->withErrors('Your account is Inactive or not verified');
        

active 是用户表中的一个标志。 0 = 不活动,1 = 活动。所以整个函数看起来像下面..

public function postLogin(Request $request)
    
        $this->validate($request, [
            'email' => 'required|email', 'password' => 'required',
        ]);
        if ($this->auth->validate(['email' => $request->email, 'password' => $request->password, 'active' => 0])) 
            return redirect($this->loginPath())
                ->withInput($request->only('email', 'remember'))
                ->withErrors('Your account is Inactive or not verified');
        
        $credentials  = array('email' => $request->email, 'password' => $request->password);
        if ($this->auth->attempt($credentials, $request->has('remember')))
                return redirect()->intended($this->redirectPath());
        
        return redirect($this->loginPath())
            ->withInput($request->only('email', 'remember'))
            ->withErrors([
                'email' => 'Incorrect email address or password',
            ]);
    

【讨论】:

您的第一次验证检查也会返回“您的帐户处于非活动状态或未验证”的错误电子邮件/密码。您应该验证电子邮件/密码,然后验证活动状态,如果没有失败则登录。 你可以看看我对另一个问题的回答。 ***.com/questions/31015606/… '$this->validate' 验证是否提供了有效的电子邮件和密码。 我说的是你的第一个if() 声明。如果用户处于活动状态但提供不匹配的电子邮件/密码,则它仍会返回“您的帐户处于非活动状态或未验证”错误消息。 如果您看到,如果用户提供了有效的电子邮件和密码,并且如果“活动”=0(非活动),那么只有条件成立。否则它将尝试使用提供的电子邮件、密码登录

以上是关于将 laravel 5 内置身份验证扩展为仅登录“如果用户 == 活动”的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.5 无法使用身份验证脚手架登录

Laravel 5 - 更改默认登录操作

在 Laravel 5 中进行身份验证后重定向

共享点身份验证。如何从 ADFS 获取 SharePoint cookie

使用内置的 Laravel 5.2 身份验证并加载 SPA,然后为所有其他路由加载 Dingo API

Laravel 5.3 中间件:创建用于身份验证的中间件