2011-04-04 98 views
5

我开始一个项目和我使用symfony,我第一次与symfony,其实真的很棒,我已经安装了sfDoctrineGuardPlugin,一切正常,直到现在,为什么呢?,因为前端用户可以在后台登录,反之亦然,我不想这样,所以,我开始谷歌,我在这里发现Symfony sfDoctrineGuardPlugin custom login query在SO,但我不知道我应该在哪里放置这个功能,所以我没有测试过它。独立的前端和后端用户与sfDoctrineGuardPlugin

因为我不希望前端用户可以在后端登录,我想我可以使用凭据,我可以吗?但是,symfony在登录后检查用户凭据,我不希望他们都没有,那么,我该如何实现这一目标?也许如果我可以在会话中拥有名称空间,我可以检查后端名称空间中的管理员也适用于前端用户,所以他们从来没有固定,我想。

我不知道是否真的知道sfDoctrineGuardPlugin是否有一些可以管理这种情况的配置,存在这样的配置?

另外,在我的后端,我希望有一个页面来管理前端用户,其他用于后端用户,因为前端用户将有一个配置文件和地址,认为这是更容易,但我不知道从哪里开始。

需要一些帮助,在这里

感谢

+0

虽然,你想出了一个合理的答案。我建议你先分析一下你是否真的需要2个独立的应用程序。虽然这可能是合乎逻辑的,但您很快会发现在应用程序之间重复使用代码很困难,但国际化和测试存在一个问题。我发现拥有1个应用程序要容易得多。仅供参考,Symfony2也没有“应用”的概念。 – Dziamid 2011-04-12 21:56:22

回答

2

几天编码后,我能完全按照我的意愿去做,我要分享我的解决方案:
我以在SO这里找到的一个例子开始,你可以在这里阅读这篇文章:
Symfony sfDoctrineGuardPlugin custom login query 它给了我一个想法,我执行了,所以,我创建\ LIB \ Util.class.php,具有的功能,一个用于查询后台用户和另一个用于前端用户

static public function retrieveCustomer($username, $isActive = true) 
{ 
    $query = Doctrine_Core::getTable('sfGuardUser')->createQuery('u') 
    ->leftJoin('u.Groups g') 
    ->leftJoin('g.Permissions p') 
    ->where('u.username = ?', $username) 
    ->addWhere('u.is_active = ?', $isActive) 
    ->addWhere('g.name = ?', 'customers'); 

    return $query->fetchOne(); 
} 

static public function retrieveAdmin($username, $isActive = true) 
{ 
    $query = Doctrine_Core::getTable('sfGuardUser')->createQuery('u') 
    ->leftJoin('u.Groups g') 
    ->leftJoin('g.Permissions p') 
    ->where('u.username = ?', $username) 
    ->addWhere('u.is_active = ?', $isActive) 
    ->whereIn('g.name', array('administrators','operators')); 

    return $query->fetchOne(); 
} 

现在,在每个应用程序的app.yml,我现在覆盖插件

#Example for apps/backend/config/app.yml 
all: 
    sf_guard_plugin: 
     retrieve_by_username_callable: Util::retrieveAdmin 

直到默认查询一切都很好,但我开始面对另一个问题,所以我打开一个新的线程: Overwriting isAuthenticated() in symfony在那里我得到了我的解决方案的最后一步,这是为每个应用程序设置型动物会话名称,因此,在每个应用程序的factories.yml

#apps\backend\config\factories.yml 
storage: 
    class: sfSessionStorage 
    param: 
    session_name: backend 

现在所有设置,前端的用户不能在后端应用程序登录,反之亦然。

随时发表评论

0

最常见的方法是通过证书,我backend应用security.yml样子:

all: 
    is_secure: on 
    credentials: [login_backend] 
+0

感谢您的答案,但凭据在用户登录后被检查,我不希望这样,因为你可以登录,只是不能访问这个应用程序,在我的情况下,我的整个前端应用程序是不安全的,只是某些页面,如果我使用凭据,用户看起来像是在不安全的页面中,并且我不希望 – 2011-04-04 18:36:16