Search code examples
laravellaravel-5laravel-authentication

How add new parameter to check in login Laravel


In LoginController I override the credentials method, like this:

protected function credentials(Request $request)
{
    $credentials = $request->only($this->username(), 'password');
    $credentials['status'] = User::STATUS_ACTIVE;

    return $credentials;
}

And this work pretty fine. But when a try to add a parameter which is not a column of the Users table I don't know how to check there. Some like this:

protected function credentials(Request $request)
{
    $credentials = $request->only($this->username(), 'password');
    $credentials['status'] = User::STATUS_ACTIVE;
    $credentials['customer-status'] = Customer::STATUS_ACTIVE;

    return $credentials;
}

Where can I check if the value is correct? I tried to make an event listener to attempt login, but it doesn't work. My idea is to make an Eloquent query to return an account of customers activities. If more then one, customer-status for this user is true.


Solution

  • If anyone is interested in knowing how I solved it, the explanation is as follows:

    Based on this code I found in github: https://gist.github.com/joseluisq/fb84779ea54eaebf54a9d8367117463e

    In LoginController.php I override 2 methods(login and sendFailedLoginResponse):

    public function login(Request $request)
    {
        $this->validateLogin($request);
    
        if ($this->hasTooManyLoginAttempts($request)) {
            $this->fireLockoutEvent($request);
            return $this->sendLockoutResponse($request);
        }
    
        $this->incrementLoginAttempts($request);
    
        $user = User::where('email', $request->email)->first();
    
        if (!$user) {
            return $this->sendFailedLoginResponse($request);
        }
    
        $customers = Customer::join('users_customers', 'users_customers.customer_id', 'customers.id')
            ->where([
                ['users_customers.user_id', '=', $user->id],
                ['customers.status', '=', Customer::STATUS_ACTIVE]
            ])
            ->count();
    
        if ($customers === 0) {
            return $this->sendFailedLoginResponse($request, 'auth.inactive');
        }
    
        if ($this->attemptLogin($request)) {
            return $this->sendLoginResponse($request);
        }
    
        return $this->sendFailedLoginResponse($request);
    }
    
    protected function sendFailedLoginResponse(Request $request, $trans = 'auth.failed')
    {
        $errors = ['email' => trans($trans)];
    
        if ($request->expectsJson()) {
            return response()->json($errors, 422);
        }
    
        return redirect()
            ->back()
            ->withErrors($errors);
    }
    

    Remember yourself to define message on auth.php and set uses needed.

    Ps.: I don't use $credentials['customer-status'] = Customer::STATUS_ACTIVE;, as I thought I would.