在Symfony中对特定子域进行身份验证

时间:2012-03-14 17:41:40

标签: php symfony

这似乎是一个简单的问题,但我似乎无法在任何地方找到明确的答案。

我正在编写一个应用程序,供多个用户使用。每家公司及其用户只能访问其数据。我希望每家公司都有自己的子域名:即company1.myapp.com,company2.myapp.com等

当他们输入该URL时,我正在使用子域从数据库获取用户信息,他们可以从那里登录。我将他们的公司ID(子域)设置为会话变量,以便应用知道哪些数据它应该从DB中拉出来

我无法解决的问题: - 如何将身份验证锁定到一个子域?即,一旦通过身份验证,如果我将域名从company1.myapp.com更改为company2.myapp.com,我该如何确保系统知道用户只对company1进行了身份验证?

任何指针都表示赞赏。

谢谢, 格雷格

2 个答案:

答案 0 :(得分:1)

ACL(Access Control Lists)是你的答案。我链接的相关食谱条目包含您需要的所有信息。

答案 1 :(得分:0)

感谢Symfony forums的一些帮助,我似乎使用了一个监听器。

定义侦听器#config.yml - 记下优先级,否则页面似乎在终止会话之前呈现。

services:        
  company_listener:
    class: myApp\SecurityBundle\Controller\CompanyListener
    arguments: 
        security: "@security.context", 
        container: "@service_container"
    tags:
        - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 64 }

听众类

class CompanyListener extends controller
{

public static $companyID;
private $securityContext;
protected $container;

public function __construct(SecurityContext $context, $container)
{
    $this->securityContext = $context;
    $this->container = $container;
}

public function onKernelRequest(GetResponseEvent $event)
{       

    $request = $event->getRequest();
    $session = $request->getSession();              

    $currentHost = $request->getHost();

    if(is_object($session)){
        $companyID = $session->get('companyID');
        $sessionHost = $session->get('subdomain');

        if ($sessionHost != $currentHost) {
            $this->get('request')->getSession()->invalidate();
        }           
    }

    $session->set('company', $currentHost);

}
}