PHP Laravel Auth пароль от таблицы пользователей, идентификатор из другой таблицы - PullRequest
0 голосов
/ 15 мая 2019

Я уже некоторое время слоняюсь по Интернету и не могу найти ответ на свой вопрос, поэтому задаю его здесь.

Я хочу аутентифицировать пользователей для входано это должно быть сделано с информацией из двух отдельных таблиц.

Я отправляю значения на свой контроллер: значок и пароль. Я получаю к ним доступ с помощью

$request->badge (note: This is the account id)
$request->password (note: this is the users password)

Ранее я пробовал следующее:

public function store(Request $request)
{
    $request->validate([
        'badge' => 'required|int',
        'password' => 'required|string',
    ]);

    $account = Account::select('id', 'user_id')->where('id', $request->badge)->first();
    if(!$account)
        return back()->withInput()->withErrors(['password' => 'Incorrect badge or password!']);
    else
    {
        if(Auth::attempt(['username' => $accounts->user->username, 'password' => $request->password])) 
        {

            return redirect()->route('home');
        }       
        else 
        {
            return back()->withInput()->withErrors(['password' => 'Incorrect badge or password!']);
        }

    }    
}

Это войдет в систему пользователя, однако, когда я использую Auth :: id (), он возвращает идентификатор пользователя, а не учетной записи.

пример: $ request-> значок заполнен 25 (который является идентификатором учетной записи), идентификатор пользователя равен 1. Auth :: id возвращает 1 вместо моего желаемого 25.

Моя таблица выглядит следующим образом:

users
----
id
username
email
password

accounts
-----
id
user_id
name

У меня есть отношения в аккаунтах и ​​пользователях, чтобы связать их вместе

public function accounts()
{
    return $this->hasMany(Accounts::class, 'user_id', 'id');
}


public function user()
{
    return $this->belongsTo(User::class, 'id', 'user_id');
}

Я хочу, чтобы auth :: id дал мне 25 вместо 1.

Ответы [ 2 ]

1 голос
/ 15 мая 2019

Поскольку у вас уже есть идентификатор, если для правильной учетной записи это только отношения hasOne между учетной записью и соответствующим пользователем.

В вашей конфигурации авторизации вам необходимо изменить модель поставщика users на модель вашей реальной учетной записи:

'providers' => [ 
    'users' => [ 
        'driver' => 'eloquent', 
        'model' => App\Models\Account::class, 
    ],
],

В модели учетной записи мы затем добавляем глобальную область, которая всегда выбирает пароль из соответствующей записи пользователя, чтобы у auth не было с этим проблем:

class Account extends Model
{
    protected $table = 'accounts';

    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('withPassword', function ($builder) {
            $builder
                ->join('users', 'accounts.user_id', 'users.id')
                ->select(DB::raw('accounts.*, users.password'));
        });
    }
}

Область действия гарантирует, что столбец password всегда присутствует, если вы запрашиваете учетную запись. Вы можете изменить его так, чтобы учетная запись всегда включала также некоторые другие столбцы, но на данный момент это должно работать так, как ожидалось.


В чате мы обсуждали тему преимуществ ручной аутентификации с login или loginById в этом сценарии. Возможное решение будет следующим:

$account = Account::select(
    'accounts.id',
    DB::raw('(SELECT `password` FROM users WHERE accounts.user_id = users.id) AS `password`'))
) 
    ->where('accounts.id', $request->badge)
    ->first();

if ($account) { 
    if (Hash::check($request->password, $account->password)) { 
        Auth::loginUsingId($account->id);

        return redirect()->route('home'); 
    } else { 
        return back()->withInput()->withErrors(['password' => 'Incorrect badge or password!']); 
    } 
} else { 
    return back()->withInput()->withErrors(['password' => 'Incorrect badge or password!']); 
}
0 голосов
/ 15 мая 2019

Я могу быть совершенно не прав, но вы могли бы применить глобальную область видимости к модели Users, которая автоматически присоединяется к таблице accounts каждый раз, когда вы запрашиваете пользователя.

Это объединение автоматически заменяет user_id идентификатором учетной записи, учитывая, как объединения работают, но вам, возможно, придется поиграться с raw select , чтобы получить значения, как вы хотите.

class User extends Model
{
    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope('account', function (Builder $builder) {
            $builder->join('accounts', 'users.id', ''accounts.user_id');
        });
    }
}

Toудалите область из любого запроса, который вы можете просто использовать User::withoutGlobalScope('account').

Подробнее о использовании глобальных областей действия здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...