Определите, какой класс PHP основан на разработке или производственной среде

Я интегрировал SimpleSAMLphp с моим приложением, однако он работает только в производственной среде, поскольку в других местах нет подключения к серверам IdP. Как я могу продолжить работу в среде разработки над вещами, требующими аутентификации?

Я написал класс-обертку, который предоставляет необходимые методы SimpleSAML_Auth_Simple учебный класс. Соответствующий код выглядит следующим образом:

Страницы, требующие аутентификации

<?php

// (assume autoloading)
$saml = new SAMLWrapper('name-of-sp');
$saml->requireAuthentication('https://[::1]/app/saml-controller.php?callback=1');
$userAttributes = $saml->getAttributes();

// rest of application code below...

Класс Wrapper

class SAMLWrapper extends IAuthentication
{
private $as;

public function __construct($sp) {
require_once('/var/simplesamlphp/lib/_autoload.php');
// THIS PATH DOES NOT EXIST ON DEV

$this->as = new \SimpleSAML_Auth_Simple($sp);
}

public function requireAuthentication($callback) {
$this->as->requireAuth(array('ReturnTo' => $callback));
}

public function getAttributes() {
return $this->as->getAttributes();
}
}

Обертка-пустышка

Я подумал написать фиктивную обертку вот так:

class DummySAML extends IAuthentication
{
private $attrs;

public function __construct(array $attrs) {
$this->attrs = $attrs;
}

public function requireAuthentication() {
return;
}

public function getAttributes() {
return $this->attrs;
}
}

Однако это означает, что я должен переключаться между SAMLWrapper а также DummySAML Класс на всех страницах, требующих аутентификации:

if (getenv('SLIM_MODE') === 'DEV') {
// instantiate DummySAML with test attributes
} else {
// instantiate SAMLWrapper with service provider name
}

Есть ли более простой и лучший способ сделать это?

0

Решение

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

В моих собственных приложениях я, вероятно, получал бы оболочку аутентификации из контейнера внедрения зависимостей, регистрируя фабрику, которая проверяет среду и возвращает экземпляр соответствующего класса (реального или фиктивного). Если вы еще не используете DI, миграция может быть настоящей болью, но вы всегда можете создать одноразовую статическую фабрику, которая обрабатывает создание экземпляра соответствующей оболочки, чтобы уменьшить количество шаблонов в верхней части каждого файла.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]