63 lines
2.3 KiB
PHP
63 lines
2.3 KiB
PHP
<?php
|
|
/**
|
|
* @package Bicycle
|
|
* @author Egor Isaev
|
|
* @description Auth.php
|
|
* @copyright (c) 06/08/2026
|
|
*/
|
|
|
|
namespace Services;
|
|
|
|
use Services\Auth\AuthDriver;
|
|
use Services\Auth\FileAuthDriver;
|
|
use System\Classes\Config;
|
|
use System\Classes\MyException;
|
|
|
|
/**
|
|
* Точка входа в авторизацию. Драйвер по умолчанию — Config::get('auth', 'driver')
|
|
* (по умолчанию 'file'); конкретный контроллер может запросить другой явно
|
|
* (Auth::instance('ldap') и т.п., когда такой драйвер появится) — без
|
|
* изменения остального кода.
|
|
*
|
|
* Auth::instance()->login($login, $password);
|
|
* Auth::instance()->loggedIn();
|
|
* Auth::instance()->getUser();
|
|
* Auth::instance()->logout();
|
|
*/
|
|
class Auth
|
|
{
|
|
/** @var array<string,class-string<AuthDriver>> Реализации по имени драйвера */
|
|
protected static array $_drivers = [
|
|
'file' => FileAuthDriver::class,
|
|
// 'db' => \Services\Auth\DbAuthDriver::class, // позже
|
|
// 'ldap' => \Services\Auth\LdapAuthDriver::class, // позже
|
|
// 'keycloak' => \Services\Auth\KeycloakAuthDriver::class, // позже
|
|
];
|
|
|
|
/** @var array<string,AuthDriver> Кэш созданных драйверов по имени */
|
|
protected static array $_instances = [];
|
|
|
|
/**
|
|
* Возвращает драйвер авторизации по имени (кэшируется).
|
|
*
|
|
* @param string|null $name Имя драйвера; null — значение по умолчанию из конфига
|
|
* @return AuthDriver
|
|
* @throws MyException Если драйвер не зарегистрирован
|
|
*/
|
|
public static function instance(?string $name = null): AuthDriver
|
|
{
|
|
$name ??= Config::get('auth', 'driver') ?? 'file';
|
|
|
|
if (!isset(self::$_instances[$name])) {
|
|
if (!isset(self::$_drivers[$name])) {
|
|
throw new MyException('Неизвестный драйвер авторизации: :name', [':name' => $name]);
|
|
}
|
|
|
|
$class = self::$_drivers[$name];
|
|
self::$_instances[$name] = new $class();
|
|
}
|
|
|
|
return self::$_instances[$name];
|
|
}
|
|
}
|