【问题标题】:Separate frontend and backend users with sfDoctrineGuardPlugin使用 sfDoctrineGuardPlugin 分离前端和后端用户
【发布时间】:2011-07-29 07:11:22
【问题描述】:

我正在开始一个项目,我正在使用 symfony,我第一次使用 symfony,实际上真的很棒,我已经安装了 sfDoctrineGuardPlugin,到目前为止一切正常,为什么?,因为前端用户可以登录后端并反之亦然,我不希望这样,所以,我开始 google,我在 SO 中找到了Symfony sfDoctrineGuardPlugin custom login query,但我不知道我应该把函数放在哪里,所以我还没有测试过。

由于我不希望前端用户可以在后端登录,我想我可以使用凭据,可以吗?但是,symfony 在登录后检查用户凭据,我也不想要,所以,我怎么能做到这一点?,也许如果我可以在会话中有命名空间,我可以检查后端命名空间中是否有管理员也适用于前端用户,所以我认为他们永远不会得到修复。

我真的不知道 sfDoctrineGuardPlugin 有没有可以管理这种情况的配置,有这样的配置吗??

另外,在我的后端,我希望有一个页面来管理前端用户,以及其他用于后端用户的页面,因为前端用户会有个人资料和地址,我认为这更容易,但我不知道从哪里开始。

在这里需要一些帮助

谢谢

【问题讨论】:

  • 不过,你想出了一个合理的答案。如果你真的需要 2 个单独的应用程序,我建议你先分析一下。虽然这可能是合乎逻辑的,但您很快就会发现很难在应用程序之间重用代码,国际化和测试存在问题。我发现拥有 1 个应用程序要容易得多。仅供参考,Symfony2 也没有“应用程序”的概念。

标签: php plugins symfony1 sfguard


【解决方案1】:

经过几天的编码,我能够完全按照自己的意愿进行操作,我将分享我的解决方案:
我从在SO 找到的示例开始,您可以在此处阅读帖子:
Symfony sfDoctrineGuardPlugin custom login query 它给了我一个想法,我执行了它,所以,我创建了 \lib\Util.class.php,带有 to 函数,一个用于查询后端用户,另一个用于前端用户

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

现在一切就绪,前端用户无法登录后端应用程序,反之亦然。

欢迎评论

【讨论】:

    【解决方案2】:

    最常见的方法是通过凭据,我的backend 应用程序security.yml 看起来像:

    all:
      is_secure: on
      credentials: [login_backend]
    

    【讨论】:

    • 感谢您的回答,但是在用户登录后会检查凭据,我不希望那样,因为您可以登录,只是无法访问此应用程序,在我的情况下,我的整个前端应用程序不安全,只是某些页面,如果我使用凭据,用户看起来会在不安全的页面中显示,我不希望这样
    猜你喜欢
    • 2017-03-10
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多