Рубрики
Uncategorized

Авторизация в Ларавеле

Автор оригинала: David Wong.

В laravel есть компонент под названием Auth . Компонент auth обеспечивает функцию аутентификации всей платформы. Здесь я хочу кратко проследить логику его реализации.

Прежде всего, из php artisan make:Начало аутентификации

# Illuminate\Auth\Console\AuthMakeCommand.php

public function handle()
{
    // Create directories and files to store the auth front-end interface
    // The template is stored under the stubs of AuthConsole
    $this->createDirectories();
    $this->exportViews();

    if (! $this->option('views')) {
        // Generate HomeController Controller Controller File
        file_put_contents(
            app_path('Http/Controllers/HomeController.php'),
            $this->compileControllerStub()
        );
        // Generating auth-related routing
    file_put_contents(
        base_path('routes/web.php'),
        file_get_contents(__DIR__.'/stubs/make/routes.stub'),
        FILE_APPEND
        );
    }
}

Создание файлов ресурсы/представления/аутентификацияресурсы/макеты Файл маршрутизации web.php, и контроллер под Http/Контроллеры/Auth

Поговорим о csrf-токене


        function csrf_token()
    {
        $session = app('session');

        if (isset($session)) {
            return $session->token();
        }

        throw new RuntimeException('Application session store not set.');
    }

Способ входа в систему контроллера входа

public function login(Request $request)
    {
                // Check Request Body
        $this->validateLogin($request);
                // Judging whether requests failed too many times
        if ($this->hasTooManyLoginAttempts($request)) {
            $this->fireLockoutEvent($request);

            return $this->sendLockoutResponse($request);
        }
                // Determine whether the validation has passed
        if ($this->attemptLogin($request)) {
            return $this->sendLoginResponse($request);
        }
                // Record the number of requests that failed
        $this->incrementLoginAttempts($request);

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

Попытка Входа в Систему: Метод Аутентификации При Входе в Систему

By Auth::guard() быть дома Осветите\Auth\AuthManager Сначала посмотрите на поставщиков услуг. AuthServiceProvider AuthServiceProvider Регистрирует четыре Службы

protected function registerAuthenticator()
    {
        $this->app->singleton('auth', function ($app) {
            $app['auth.loaded'] = true;
                        // Generate an AuthManager instance
            return new AuthManager($app);
        });

        $this->app->singleton('auth.driver', function ($app) {
            return $app['auth']->guard();
        });
    }
protected function registerUserResolver()
    {
        $this->app->bind(
            AuthenticatableContract::class, function ($app) {
                return call_user_func($app['auth']->userResolver());
            }
        );
    }
protected function registerAccessGate()
    {
        $this->app->singleton(GateContract::class, function ($app) {
            return new Gate($app, function () use ($app) {
                return call_user_func($app['auth']->userResolver());
            });
        });
    }
protected function registerRequestRebindHandler()
    {
        $this->app->rebinding('request', function ($app, $request) {
            $request->setUserResolver(function ($guard = null) use ($app) {
                return call_user_func($app['auth']->userResolver(), $guard);
            });
        });
    }

Создайте экземпляр AuthManager, который создает поставщиков пользователей в AuthManager Эта функция используется для привязки поставщика услуг красноречивого с помощью аутентификации пользователя

public function __construct($app)
    {
                // Binding application instances
        $this->app = $app;
                // Bind a closure to parse the user.
                // Determine how users parse users by $guard
        $this->userResolver = function ($guard = null) {
            return $this->guard($guard)->user();
        };
    }

protected function resolve($name)
    {
        $config = $this->getConfig($name);

                // Call different driver methods for parsing users according to configuration
        $driverMethod = 'create'.ucfirst($config['driver']).'Driver';

        if (method_exists($this, $driverMethod)) {
            return $this->{$driverMethod}($name, $config);
        }
    }

Два метода определения местоположения отдельно

public function createSessionDriver($name, $config)
    {
                // Create a corresponding provider based on the configuration file
        $provider = $this->createUserProvider($config['provider'] ?? null);
                
                $guard = new SessionGuard($name, $provider, $this->app['session.store']);

        return $guard;
    }
    
    public function createTokenDriver($name, $config)
    {
        $guard = new TokenGuard(
            $this->createUserProvider($config['provider'] ?? null),
            $this->app['request'],
            $config['input_key'] ?? 'api_token',
            $config['storage_key'] ?? 'api_token'
        );
        return $guard;
    }

Так что я понял. $this->guard($guard) Метод user () Давайте сначала посмотрим, как создать экземпляр класса защиты токенов

public function __construct(UserProvider $provider, Request $request, $inputKey = 'api_token', $storageKey = 'api_token')
    {
        $this->request = $request;
        $this->provider = $provider;
        $this->inputKey = $inputKey;
        $this->storageKey = $storageKey;
    }
# Illuminate\Auth\TokenGuard

    public function user()
    {
        if (! is_null($this->user)) {
            return $this->user;
        }

        $user = null;
                // Get token from request
        $token = $this->getTokenForRequest();

        if (! empty($token)) {
                        // Determine whether the user has been authenticated successfully by retrieveByCredentials method in the user provider
            $user = $this->provider->retrieveByCredentials(
                [$this->storageKey => $token]
            );
        }

        return $this->user = $user;
    }

Выше перечислены общие функции вызова загрузки при загрузке, в то время как следующие поставщики пользовательских услуг являются конкретными функциями, которые могут изменять пользовательскую аутентификацию

Аутентифицированный Поставщик Пользовательских Данных для Привязки

# Illuminate\Auth\DatabaseUserProvider

    public function retrieveByCredentials(array $credentials)
    {
        if (empty($credentials) ||
           (count($credentials) === 1 &&
            array_key_exists('password', $credentials))) {
            return;
        }
        $query = $this->conn->table($this->table);

        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);
            }
        }
        
        $user = $query->first();
        
        // Return auth user data package
        return $this->getGenericUser($user);
    }