Laravel — Пользовательский запрос аутентификации

Как я могу добавить DESC по умолчанию логин sql запрос?

Я имею в виду по умолчанию это что-то вроде

select * from users where name = user_name limit 1,

Как я могу добавить

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

Я знаю, что столбец имени должен содержать только уникальные значения, моя система входа отличается (некоторые предопределенные пользователи в другой таблице), и мне нужно несколько регистраций пользователей с одним и тем же именем. Я просто хочу войти на последнюю запись в базе данных. Пожалуйста, помогите мне, как я могу настроить модель провайдера в laravel? Я не знаю, какие файлы нужно изменить, чтобы это работало.

Это мой LoginController.php, но вы можете игнорировать его (я добавил его, потому что это требовалось для некоторых пользователей), просто посмотрите на loginController по умолчанию из 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
);
}
}

Все методы в моем LoginController переопределяют методы из vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php

1

Решение

Замените LoginController следующим. Я удалил метод username () и заменил метод tryLogin (), чтобы получить последнего пользователя в вашей базе данных с учетом значения сеанса ‘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();
}
}

}
2

Другие решения

Вы не должны изменять / удалять любые фреймворки и коды.
в верхней части вашего контроллера входа просто добавьте эту черту:

use AuthenticatesUsers;

тогда вы можете переопределить все функции входа в систему.

для аутентификации имя пользователя / пароль просто переопределить attemptLogin () функция.

0

Так что, если я правильно понимаю ваш вопрос, вы хотите изменить SQL-запрос по умолчанию для выбора пользователя при аутентификации.
в attemptLogin метод, который вы называете attempt и это в StatefulGuard Interface и реализация находится в /vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php так что вам нужно либо полностью переопределить attempt метод, либо методы в нем.

0

Я нашел другое решение, которое работает, но я верю, что оно что-то испортит (я не уверен), поэтому я проголосовал за ответ Polaris как правильный.

Вы можете оставить LoginController по умолчанию и изменить App / User.php следующим образом:
Это в основном отменяет retrieveByCredentials метод, используемый в Illuminate\Auth\EloquentUserProvider; , Проблема в том, что я считаю, что этот метод обычно не доступен напрямую из Users.php таким образом, вы не переопределяете это напрямую. Но почему-то это работает :)).

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Auth\EloquentUserProvider;

class User extends Authenticatable
{
use Notifiable;

/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'password',
];

/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];

public function retrieveByCredentials(array $credentials)
{
if (empty($credentials) ||
(count($credentials) === 1 &&
array_key_exists('password', $credentials))) {
return;
}

// First we will add each credential element to the query as a where clause.
// Then we can execute the query and, if we found a user, return it in a
// Eloquent User "model" that will be utilized by the Guard instances.
$query = $this->createModel()->newQuery();

foreach ($credentials as $key => $value) {
if (Str::contains($key, 'password')) {
continue;
}

if (is_array($value) || $value instanceof Arrayable) {
$query->whereIn($key, $value);
} else {
$query->where($key, $value);
}
}

return $query->orderBy('id', 'desc')->first();
}
}
0
По вопросам рекламы [email protected]