. */ namespace SP\Providers\Auth; use SP\Core\Application; use SP\Domain\Auth\Dtos\UserLoginDto; use SP\Domain\Auth\Services\AuthException; use SP\Domain\User\Dtos\UserDataDto; use SP\Providers\Provider; use SplObjectStorage; use function SP\__u; defined('APP_ROOT') || die(); /** * Class AuthProvider * * Esta clase es la encargada de realizar la autentificación de usuarios de sysPass. */ final class AuthProvider extends Provider implements AuthProviderService { /** * @var SplObjectStorage */ protected readonly SplObjectStorage $auths; public function __construct(Application $application) { parent::__construct($application); $this->auths = new SplObjectStorage(); } /** * Auth initializer * */ public function initialize(): void { } /** * Register authentication methods * * @param AuthService $auth * @param AuthType $authTypeEnum * @throws AuthException */ public function registerAuth(AuthService $auth, AuthType $authTypeEnum): void { if ($this->auths->contains($auth)) { throw AuthException::error(__u('Authentication already initialized'), $auth::class); } $this->auths->attach($auth, $authTypeEnum); } /** * @inheritDoc */ public function doAuth(UserLoginDto $userLoginData, callable $callback): ?UserDataDto { $this->auths->rewind(); while ($this->auths->valid()) { $authResult = new AuthResult( $this->auths->getInfo(), $this->auths->current()->authenticate($userLoginData) ); $callback($authResult); $authData = $authResult->getAuthData(); if ($authData->isAuthoritative() && $authData->isOk()) { return $authData->getUserDataDto(); } $this->auths->next(); } return null; } }