0

我已将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
}

有没有更简单更好的方法来做到这一点?

4

1 回答 1

0

一种选择是将基于环境的切换移动到单个包装类中。一个显而易见的缺点是您的测试属性需要在类中进行硬编码,或者即使在生产中也总是传递给构造函数。否则,您将无法使用单个构造函数支持这两种情况。

在我自己的应用程序中,我可能会从依赖注入容器中获取身份验证包装器,注册一个检查环境并返回适当类(真实或虚拟)实例的工厂。如果您还没有使用 DI,那么迁移可能会很痛苦,但您始终可以创建一个一次性的静态工厂来处理适当包装器的实例化,以减少每个文件顶部的样板数量。

于 2016-05-24T21:43:16.587 回答