Symfony2自定义用户检查器基于已接受的eula

时间:2012-06-19 12:11:15

标签: authentication symfony doctrine-orm eula

我想创建自定义用户检查程序以验证针对上次接受的eula的登录操作。 “ 想法很简单,会有很多版本的eula和用户不能登录,直到他接受最新的eula。

情景是:

  1. 用户创建新帐户并接受eula。
  2. Eula得到更新
  3. 用户尝试登录,但他没有接受最新的eula
  4. 用户获得相同的登录表单,但附加字段“接受最新的eula”
  5. 用户登录和系统插入信息:当前日期和时间,用户ID,Eula id以跟踪eula接受度。
  6. 我发现了这个: https://groups.google.com/forum/#!msg/symfony2/D0V0bFks9S0/Qg9mrbpfB3IJ

    但遗憾的是,没有完整版的自定义用户检查程序。我该如何实现剩下的呢?

3 个答案:

答案 0 :(得分:8)

答案其实很明显。 在您的自定义捆绑包中:

config.yml

parameters:
    security.user_checker.class: Acme\Bundle\UserBundle\Security\UserChecker

Userchecker:

class UserChecker extends BaseUserChecker
{
    /**
     * {@inheritdoc}
     */
    public function checkPreAuth(UserInterface $user)
    {
        //do your custom preauth stuff here
        parent::checkPreAuth($user);
    }
}

答案 1 :(得分:6)

您可以在捆绑包中重新定义Symfony的用户检查服务(security.user_checker):

# services.yml
security.user_checker:
    class: MyBundle\Checker\UserChecker
    arguments: [ "@some.service", "%some.param%" ]

然后扩展Symfony的UserChecker:

# UserChecker.php

use Symfony\Component\Security\Core\User\UserChecker as BaseUserChecker;

class UserChecker extends BaseUserChecker
{
    public function checkPreAuth(UserInterface $user)
    {
        parent::checkPreAuth($user);

        // your stuff
    }

    public function checkPostAuth(UserInterface $user)
    {
        parent::checkPostAuth($user);

        // your stuff
    }
}

在身份验证过程中security.user_checker调用\Symfony\Component\Security\Core\Authentication\Provider\UserAuthenticationProvider::authenticate()服务

答案 2 :(得分:0)

为什么不将事件监听器附加到kernel.request事件并观察当前登录用户是否已接受最新的EULA?

要获得当前用户,您可以使用以下内容:

$securityContext = $this->container->get('security.context');
if (!$securityContext) {
    return;
}

$user = $securityContext->getToken()->getUser();