Rizal Fakhri
Rizal Fakhri

Reputation: 57

How to create custom authentication with Laravel on an existing default authentication

I'm curently completing my job, but my client is requested more feature on managing users, like suspending an account, or freezing an account, I'm very sure it can be done easily with this : https://laravel.com/docs/5.4/authentication#authenticating-users, but I'm already using default php artisan make:auth Authentication. My question is, It's posible to add more check while user logging in like, if active == true or something like that? Thanks!

Upvotes: 2

Views: 671

Answers (3)

Pankit Gami
Pankit Gami

Reputation: 2553

In laravel 5.4, You can use authenticated post login hook of AuthenticatesUsers to do your custom validation.

protected function authenticated( Request $request, $user ) {

    if($user->active){
         return redirect()->intended($this->redirectPath()); 
    }

    $this->guard()->logout();

    $request->session()->flush();

    $request->session()->regenerate();

    return redirect()->back()
                     ->withInput($request->except('password'))
                     ->withError('Please activate your account.')
}

Upvotes: 2

Shailesh Ladumor
Shailesh Ladumor

Reputation: 7242

Put this functions in your LoginController

public function postLogin(Request $request)
{
    $credentials = $request->only('email', 'password');
    $user=User::whereEmail($credentials['email'] )->first();
    if (!empty($user) && $user->active) {
        if (Auth::attempt($credentials)) {
            return redirect()->intended($this->redirectPath());
        } else {
            return redirect($this->loginPath())
                ->withInput($request->only('email', 'remember'))
                ->withErrors(['email' => $this->getFailedLoginMessage()]
                );
        }
    } else {
        return redirect($this->loginPath())
            ->withInput($request->only('email', 'remember'))
            ->withErrors(['email' => $this->getFailedLoginMessage()]
            );
    }
}

public function loginPath()
{
    return property_exists($this, 'loginTo') ? $this->redirectTo : '/login';
}


protected function getFailedLoginMessage()
{
    return Lang::has('auth.failed')
        ? Lang::get('auth.failed')
        : 'set here your custom message.';
}

Upvotes: 2

Sagar Arora
Sagar Arora

Reputation: 1773

you can over ride the existing login function by your own like this:

public function postLogin(Request $request)
{
    $this->validate($request, [
        'email' => 'required|email', 'password' => 'required',
    ]);

    $credentials = $this->getCredentials($request);

    // This section is the only change
    if (Auth::validate($credentials)) {
        $user = Auth::getLastAttempted();
        if ($user->active) {
            Auth::login($user, $request->has('remember'));
            return redirect()->intended($this->redirectPath());
        } else {
            return redirect($this->loginPath()) // Change this to redirect elsewhere
                ->withInput($request->only('email', 'remember'))
                ->withErrors([
                    'active' => 'You must be active to login.'
                ]);
        }
    }

    return redirect($this->loginPath())
        ->withInput($request->only('email', 'remember'))
        ->withErrors([
            'email' => $this->getFailedLoginMessage(),
        ]);

}

And you can also do modifications as per your need.

Thanks

Upvotes: 2

Related Questions