0

我正在尝试为一个非常奇怪的用例创建一个 fosuserbundle,这是强制性要求,因此没有外交空间。用例如下:

  • 由 jms 消息填充的 mongo db 表中的用户 - 无注册表单
  • 用户通过 ldap 登录
  • 在根据 mongodb 文档检查成功登录用户名后,ldap 未创建用户记录

考虑到 ldap 可以成功登录 ldap 中存在但无法访问站点的人(但登录仍然成功),执行这种身份验证链的最佳方法是什么?

我在考虑一些可能的选择:

  • 收听交互式登录事件,但恕我直言,无法修改 onSuccess 事件
  • 创建一个自定义 AuthenticationListener 以在 onSuccess 方法中进行另一次检查
  • 使用 scheb 两因素捆绑的链式身份验证

任何提示?

4

1 回答 1

1

我已经使用Fr3DLdapBundle了它可以很容易地与 FOSUserBundle 合并(我使用的是 2.0.x 版本,我不知道以前的版本是否会做同样的事情或容易设置)。

LdapManager(默认情况下)中,如果一个新用户不在我想要的数据库中(并且似乎不是你想要的),它会创建一个新用户,所以我添加了我自己的管理器来检查存在数据库中的用户,然后进行相应的处理。

use FR3D\LdapBundle\Ldap\LdapManager as BaseLdapManager;
.. Other use stuff ..

class LdapManager extends BaseLdapManager
{
    protected $userRepository;
    protected $usernameCanonicalizer;

    public function __construct(
        LdapDriverInterface $driver,
        $userManager,
        array $params,
        ObjectRepository $userRepository,
        CanonicalizerInterface $usernameCanonicalizer
    ) {
        parent::__construct($driver, $userManager, $params);

        $this->userRepository = $userRepository;
        $this->usernameCanonicalizer = $usernameCanonicalizer;
    }

    /**
     * {@inheritDoc}
     */
    public function findUserBy(array $criteria)
    {
        $filter  = $this->buildFilter($criteria);
        $entries = $this->driver->search(
            $this->params['baseDn'], $filter, $this->ldapAttributes
        );

        if ($entries['count'] > 1) {
            throw new \Exception('This search can only return a single user');
        }

        if ($entries['count'] == 0) {
            return false;
        }

        $uid = $entries[0]['uid'][0];
        $usernameCanonical = $this->usernameCanonicalizer->canonicalize($uid);

        $user = $this->userRepository->findOneBy(
            array('usernameCanonical' => $usernameCanonical)
        );

        if (null === $user) {
            throw new \Exception('Your account has yet to be set up. See Admin.');
        }

        return $user;
    }
于 2014-11-07T11:19:59.563 回答