Search code examples
phplaravellaravel-5laravel-5.3

Laravel Auth Login by company name, username, and password


I like user to login by company name, username, and password - they need to enter all those fields.

username, and password fields are in the users table. company_name are in the companies table.

username can be duplicated in the users table but each username is belong to different company name. company_id is defined in users table.

How can I Auth against company name, username, and password?

I had a look at the attemptLogin() method.

 protected function attemptLogin(Request $request)
    {
        return $this->guard()->attempt(
            $this->credentials($request), $request->has('remember')
        );
    }

I can't override this because I need to pass specific user that is belong to company then do auth check.

Update:

protected function authenticated(Request $request, User $user)
{
    if (!$user->enable) {
        Auth::logout();

        return redirect('/login')->with('status', 'Account is disabled');
    }

    return redirect()->intended('/');
}

Solution

  • Since username and company_name pair is unique, you can do this:

    protected function attemptLogin(Request $request)
    {
        $user = User::where('username', $request->username)
            ->where(function ($q) use ($request) {
                q->whereHas('company', function ($q) use ($request) {
                    $q->where('company_name', $request->company_name);
                })
                ->orWhereHas('warehouse', function ($q) use ($request) {
                    $q->where('company_name', $request->company_name);
                });
            })
            ->first();
    
        return !is_null($user) && \Hash::check($request->password, $user->password));
    }
    
    protected function validateLogin(Request $request)
    {
        $this->validate($request, [
            'company_name' => 'required',
            'username' => 'required|string',
            'password' => 'required|string',
        ]);
    }