Как добавить дополнительное условие в метод Laravel 6 Auth попытки ()? - PullRequest
1 голос
/ 25 января 2020

Я использую Larvel 6

Я хочу добавить эту функцию в свое приложение:

Приложение получает номер мобильного телефона пользователя, затем генерирует mobile_number_verification_code как 145787 и обновления таблица пользователя! тогда сгенерированный код будет отправлен в виде SMS для пользователя! и он / она вводит код для входа!

Примечание: код можно использовать всего через 2 минуты после времени генерации

это будет User модель

    Schema::create('users', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('username')->unique()->nullable();
        $table->string('mobile_number')->unique()->nullable();
        $table->string('mobile_number_verification_code')->nullable();
        $table->string('mobile_number_verification_code_expires_at')->nullable();
        $table->bigInteger('mobile_number_verified_at')->nullable();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });

Я хочу использовать Laravel способ авторизации по умолчанию, поэтому я могу использовать этот код для попытки входа в систему:

/**
 * Attempt to log the user into the application.
 *
 * @param \Illuminate\Http\Request $request
 * @return bool
 */
protected function attemptLogin(Request $request)
{
    return $this->guard('users')->attempt(
        [
            'mobile_number' => '9128889966', // the mobile number
            'mobile_number_verification_code' => '145787' // the code which user has received
        ]
        , $request->filled('remember')
    );
}

все выглядит хорошо, но пропущен один важный момент: код можно использовать всего через 2 минуты после времени генерации

Как проверить, что код истек или нет? Я знаю, что могу проверить его после входа в систему, а затем, если срок действия кода истек, используйте Auth::logout();, чтобы выйти из него! но так ли это лучше? Не лучше ли редактировать метод attempt()?

1 Ответ

2 голосов
/ 25 января 2020

Вы можете проверить дату и время истечения для attemptLogin метода вашего LoginController следующим образом:

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;

class LoginController extends Controller
{
    //...

    /**
     * Attempt to log the user into the application.
     *
     * @param \Illuminate\Http\Request $request
     * @return bool
     */
    protected function attemptLogin(Request $request)
    {
        return \App\User::where('mobile_number', $request->mobile_number)
            ->whereDate('mobile_number_verification_code_expires_at', '>=', now())
            ->exists()
            && $this->guard()->attempt([
                'mobile_number' => $request->mobile_number
                'mobile_number_verification_code' => $request->mobile_number_verification_code
            ], $request->filled('remember')
    );
}

Другой способ - определить пользовательский UserProvider, который реализует интерфейс Illuminate\Contracts\Auth\UserProvider или расширяет Illuminate\Auth\EloquentUserProvider и переопределить validateCredentials и / или retrieveByCredentials методы. Затем зарегистрируйте свой настроенный UserProvider и установите его в качестве пользовательского драйвера для файла config/auth.php. См. Laravel документы , чтобы получить дополнительную информацию об этом.

...