Провайдеры пользователей User Providers

Провайдеры пользователей User Providers определяют, откуда система получает данные о пользователях. Каждый провайдер реализует интерфейс Imhotep\Contracts\Auth\UserProvider.

Array User Provider

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

// config/auth.php

'providers' => [
    'admins' => [
        'driver' => 'array',
        'users' => [
            'admin@example.com' => [
                'id' => 1,
                'email' => 'admin@example.com',
                'password' => 'admin123',
                'name' => 'Administrator',
            ],
            'moderator@example.com' => [
                'id' => 2,
                'email' => 'moderator@example.com',
                'password' => 'mod123',
                'name' => 'Moderator',
            ],
        ],
    ],
],
PHP

Database User Provider

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

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

// config/auth.php
'providers' => [
    'users' => [
        'driver' => 'database',
        'connections' => null, // Соединения с БД
        'table' => 'users', // Таблица в БД с пользователями
        'user' => App\Models\User::class, // Опционально: класс модели пользователя
    ],
],
PHP

Certificate User Provider

Провайдер для получения информации о пользователе из SSL-сертификата.

// config/auth.php
'providers' => [
    'cert_users' => [
        'driver' => 'certificate',
    ],
],
PHP

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

namespace App\Auth\UserProviders;

use Imhotep\Contracts\Auth\Authenticatable;
use Imhotep\Contracts\Auth\UserProvider;

class CustomUserProvider implements UserProvider
{
    public function __construct(
        protected array $config
    ) {}
    
    public function getById(mixed $id): ?Authenticatable
    {
        // Получение пользователя по ID
        return $this->makeUser(['id' => $id]);
    }
    
    public function getByToken(mixed $id, string $token): ?Authenticatable
    {
        // Получение по токену
        $user = $this->getById($id);
        
        if ($user && $user->getRememberToken() === $token) {
            return $user;
        }
        
        return null;
    }
    
    public function getByCredentials(array $credentials): ?Authenticatable
    {
        // Поиск по учетным данным
        $email = $credentials['email'] ?? null;
        $password = $credentials['password'] ?? null;
        
        if (!$email || !$password) {
            return null;
        }
        
        // Ваша логика поиска
        return $this->makeUser([
            'id' => 1,
            'email' => $email,
            'password' => hash('sha256', $password),
            'name' => 'User',
        ]);
    }
    
    public function updateRememberToken(Authenticatable $user, string $token): void
    {
        // Обновление токена
        $user->setRememberToken($token);
        // Сохранение в БД
    }
    
    public function validateCredentials(Authenticatable $user, array $credentials): bool
    {
        // Проверка пароля
        $hash = hash('sha256', $credentials['password']);
        return hash_equals($user->getAuthPassword(), $hash);
    }
    
    protected function makeUser(array $attributes): Authenticatable
    {
        return new \Imhotep\Auth\GenericUser($attributes);
    }
}
PHP

Теперь достаточно зарегистрировать провайдер в сервис провайдере:

// app/Providers/AppServiceProvider.php

use Imhotep\Facades\Auth;
use App\Auth\UserProviders\CustomUserProvider;

class AuthServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        Auth::extendProvider('custom', function ($app, $config) {
            return new CustomUserProvider($config);
        });
    }
}
PHP

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

// config/auth.php
'providers' => [
    'custom' => [
        'driver' => 'custom',
        // Дополнительные параметры
    ],
],
PHP

GenericUser

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

use Imhotep\Auth\GenericUser;

$user = new GenericUser([
    'id' => 1,
    'email' => 'john@example.com',
    'password' => 'hashed_password',
    'name' => 'John Doe',
]);

// Доступ к атрибутам
echo $user->name; // John Doe
echo $user->email; // john@example.com

// Методы аутентификации
$id = $user->getAuthId(); // 1
$password = $user->getAuthPassword(); // hashed_password
PHP