Стражи аутентификации Guards

Стражи guards определяют, как происходит процесс аутентификации в вашем приложении. Imhotep предоставляет несколько готовых стражей для различных сценариев использования.

Каждый страж реализует интерфейс Imhotep\Contracts\Auth\Guard и отвечает за:

  • Получение текущего пользователя
  • Проверку учетных данных
  • Управление состоянием аутентификации

Session Guard

Использует сессии для хранения информации об аутентификации. Идеально подходит для веб-приложений, потому что:

  • Хранит ID пользователя в сессии
  • Поддерживает функцию "запомнить меня"
  • Использует куки для долговременной аутентификации
  • Автоматически обновляет сессию при входе

Конфигурация

// config/auth.php
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
        'remember' => 1209600, // Время жизни "запомнить меня" (секунды)
    ],
],
PHP

Token Guard

Использует токены для аутентификации. Подходит для API и мобильных приложений.

Конфигурация

// config/auth.php
'guards' => [
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
        'input_key' => 'api_token',   // Ключ для поиска токена
        'storage_key' => 'api_token', // Поле в БД для токена
        'hash' => false,              // Хранить токен в хешированном виде
    ],
],
PHP

Request Guard

Позволяет реализовать кастомную логику аутентификации через замыкание.

Конфигурация

// config/auth.php

'guards' => [
    'custom' => [
        'driver' => 'custom',
        'provider' => 'users',
    ],
],
PHP
// app/Providers/AppServiceProvider.php

use Imhotep\Facades\Auth;
use Imhotep\Auth\Guards\RequestGuard;

Auth::extend('custom', function ($app, $config) {
    return new RequestGuard(function ($request, $provider) {
        // Ваша логика получения пользователя
        $token = $request->header('X-Custom-Token');
        
        if ($token) {
            return $provider->getByCredentials(['token' => $token]);
        }
        
        return null;
    });
});
PHP

Certificate Guard

Аутентификация по SSL-сертификатам. Идеально для корпоративных систем и банковских приложений.

// config/auth.php
'guards' => [
    'cert' => [
        'driver' => 'certificate',
        'provider' => 'cert_users',
        'identifier_field' => 'email', // Поле для идентификации
    ],
],
PHP

В настройках nginx необходимо добавить:

server {
    listen 443 ssl; # Сервер должен поддерживать https
    server_name example.local;
    root /var/www/public;
    
    ssl_verify_client on; # Проверка сертификата включена всегда
    ssl_client_certificate /etc/nginx/ssl/ca.crt; # Укажите путь к CA
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    keepalive_timeout 70;
    
    // ...
}
PHP

Создание собственного стража

Для создания собсвтенного стража реализуй интерфейс Imhotep\Contracts\Auth\Guard. Все стражи используют трейт GuardHelpers, который реализует базовый функционал.

namespace App\Auth\Guards;

use Imhotep\Contracts\Auth\Guard;
use Imhotep\Contracts\Config\IConfigRepository;
use Imhotep\Auth\Guards\GuardHelpers;

class CustomGuard implements Guard
{
    use GuardHelpers;
    
    public function __construct(
        protected string $name,
        protected IConfigRepository $config
    ) {}
    
    public function user(): mixed
    {
        if (!is_null($this->user)) {
            return $this->user;
        }
        
        // Ваша логика получения пользователя
        $token = $this->request->header('X-Custom-Token');
        
        if (! empty($token)) {
            $this->user = $this->provider->getByCredentials([
                'token' => $token
            ]);
        }
        
        return $this->user;
    }
    
    public function validate(array $credentials = []): bool
    {
        $user = $this->provider->getByCredentials($credentials);
        
        if ($user && $this->provider->validateCredentials($user, $credentials)) {
            $this->setUser($user);
            return true;
        }
        
        return false;
    }
}
PHP

После написания стража, зарегистрируйте его в сервис провайдере:

// app/Providers/AppServiceProvider.php

use Imhotep\Facades\Auth;
use App\Auth\Guards\CustomGuard;

class AuthServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        Auth::extendGuard('custom', function ($name, $config) {
            return new CustomGuard($name, $config);
        });
    }
}
PHP