Я интегрировал 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...
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
}
Есть ли более простой и лучший способ сделать это?
Один из вариантов — переместить переключение на основе env в один класс-оболочку. Одним из очевидных недостатков является то, что ваши тестовые атрибуты должны быть либо жестко запрограммированы внутри класса, либо всегда передаваться конструктору даже в процессе производства. В противном случае вы не сможете поддерживать оба сценария с помощью одного конструктора.
В моих собственных приложениях я, вероятно, получал бы оболочку аутентификации из контейнера внедрения зависимостей, регистрируя фабрику, которая проверяет среду и возвращает экземпляр соответствующего класса (реального или фиктивного). Если вы еще не используете DI, миграция может быть настоящей болью, но вы всегда можете создать одноразовую статическую фабрику, которая обрабатывает создание экземпляра соответствующей оболочки, чтобы уменьшить количество шаблонов в верхней части каждого файла.
Других решений пока нет …