Search code examples
phpsqllaravellaravel-5.6laravel-authentication

Laravel - Custom authentification query


How can I add DESC to the default login sql query?

I mean on default is something like

select * from users where name = user_name limit 1.

How can I add

select * from users where name = user_name ORDER BY id DESC limit 1?

I know that the name column should contain unique values only, my login system it's different (some predefined users in another table) and I need multiple user registrations with the same name. I just want to login on the last record in the database. Please help me how can I customize the model provider in laravel? I don't know what files to modify for this to work.

This is my LoginController.php but you can ignore it (I added it because some users required it) just look at the default loginController from php artisan make:auth

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Validation\ValidationException;
use Illuminate\Support\Facades\Session;
class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/home';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }
/**
     * Check either username or email.
     * @return string
     */

public function login(Request $request)
    {
        $this->validateLogin($request);

        // If the class is using the ThrottlesLogins trait, we can automatically throttle
        // the login attempts for this application. We'll key this by the username and
        // the IP address of the client making these requests into this application.
        if ($this->hasTooManyLoginAttempts($request)) {
            $this->fireLockoutEvent($request);

            return $this->sendLockoutResponse($request);
        }

        if ($this->attemptLogin($request)) {
            return $this->sendLoginResponse($request);
        }

        // If the login attempt was unsuccessful we will increment the number of attempts
        // to login and redirect the user back to the login form. Of course, when this
        // user surpasses their maximum number of attempts they will get locked out.
        $this->incrementLoginAttempts($request);

        return $this->sendFailedLoginResponse($request);
    }

      public function username()
    {
        $identity  = Session::get('table_id');
        $fieldName = 'name';
        request()->merge([$fieldName => $identity]);

        return $fieldName;
    }

    /**
     * Validate the user login.
     * @param Request $request
     */
    protected function validateLogin(Request $request)
    {
        $this->validate(
            $request,
            [
                'password' => 'required|string',
            ],
            [
                'password.required' => 'Password is required',
            ]
        );
    }
    /**
     * @param Request $request
     * @throws ValidationException
     */
    protected function sendFailedLoginResponse(Request $request)
    {
        $request->session()->put('login_error', trans('auth.failed'));
        throw ValidationException::withMessages(
            [
                'error' => [trans('auth.failed')],
            ]
        );
    }

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

All methods in my LoginController overrides methods from vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php


Solution

  • Replace LoginController with the following. I have removed username() method and replaced attemptLogin() method to fetch the last user in your database given your session value of 'table_id'.

    <?php
    
    namespace App\Http\Controllers\Auth;
    
    use App\Http\Controllers\Controller;
    use Illuminate\Foundation\Auth\AuthenticatesUsers;
    use Illuminate\Http\Request;
    use Illuminate\Validation\ValidationException;
    use Illuminate\Support\Facades\Session;
    use App\User;
    use Illuminate\Support\Facades\Auth;
    class LoginController extends Controller
    {
        /*
        |--------------------------------------------------------------------------
        | Login Controller
        |--------------------------------------------------------------------------
        |
        | This controller handles authenticating users for the application and
        | redirecting them to your home screen. The controller uses a trait
        | to conveniently provide its functionality to your applications.
        |
        */
    
        use AuthenticatesUsers;
    
        /**
         * Where to redirect users after login.
         *
         * @var string
         */
        protected $redirectTo = '/home';
    
        /**
         * Create a new controller instance.
         *
         * @return void
         */
        public function __construct(User $user)
        {
            $this->middleware('guest')->except('logout');
            $this->user = $user;
        }
    /**
         * Check either username or email.
         * @return string
         */
    
    public function login(Request $request)
        {
            $this->validateLogin($request);
    
            // If the class is using the ThrottlesLogins trait, we can automatically throttle
            // the login attempts for this application. We'll key this by the username and
            // the IP address of the client making these requests into this application.
            if ($this->hasTooManyLoginAttempts($request)) {
                $this->fireLockoutEvent($request);
    
                return $this->sendLockoutResponse($request);
            }
    
            if ($this->attemptLogin($request)) {
                return $this->sendLoginResponse($request);
            }
    
            // If the login attempt was unsuccessful we will increment the number of attempts
            // to login and redirect the user back to the login form. Of course, when this
            // user surpasses their maximum number of attempts they will get locked out.
            $this->incrementLoginAttempts($request);
    
            return $this->sendFailedLoginResponse($request);
        }
    
        /**
         * Validate the user login.
         * @param Request $request
         */
        protected function validateLogin(Request $request)
        {
            $this->validate(
                $request,
                [
                    'password' => 'required|string',
                ],
                [
                    'password.required' => 'Password is required',
                ]
            );
        }
        /**
         * @param Request $request
         * @throws ValidationException
         */
        protected function sendFailedLoginResponse(Request $request)
        {
            $request->session()->put('login_error', trans('auth.failed'));
            throw ValidationException::withMessages(
                [
                    'error' => [trans('auth.failed')],
                ]
            );
        }
    
    protected function attemptLogin(Request $request, User $user)
    {
        if (session()->has('table_id') != true) return redirect()->back()->withErrors(['error' => 'No username is set.']);
        $userName = $user->where('name', session('table_id'))->orderBy('id', 'desc')->first()->name;
        $remember = true;
        if (Auth::attempt(['name' => $userName, 'password' => request('password')], $remember)) {
            return redirect()->intended();
        }
    }
    
    }