基于dev或生产环境

时间:2016-05-24 21:12:26

标签: php environment simplesamlphp dev-to-production

integrated SimpleSAMLphp with my application,但它仅适用于生产环境,因为其他地方没有与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;
    }
}

但是,这意味着我必须在需要身份验证的所有页面上的SAMLWrapperDummySAML类之间切换:

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

有没有更简单,更好的方法呢?

1 个答案:

答案 0 :(得分:0)

一种选择是在单个包装类中移动基于env的切换。一个明显的缺点是你的测试属性需要在类中进行硬编码,或者总是在生产中传递给构造函数。否则,您将无法使用单个构造函数支持这两种方案。

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