10

我想创建自定义用户检查器来验证针对上次接受的 eula 的登录操作。'思路很简单,eula会有很多版本,用户需要接受最新的eula才能登录。

场景是:

  1. 用户创建新帐户并接受 eula。
  2. 欧拉更新了
  3. 用户尝试登录,但他没有接受最新的 eula
  4. 用户获得相同的登录表单,但附加字段“接受最新的 eula”
  5. 用户登录和系统插入信息:当前日期和时间、用户 id、Eula id 以跟踪 eula 接受情况。

我发现了这个: https ://groups.google.com/forum/#!msg/symfony2/D0V0bFks9S0/Qg9mrbpfB3IJ

但不幸的是,没有完整版的自定义用户检查器。我如何实现它的其余部分?

4

3 回答 3

8

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

配置.yml

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

用户检查器:

class UserChecker extends BaseUserChecker
{
    /**
     * {@inheritdoc}
     */
    public function checkPreAuth(UserInterface $user)
    {
        //do your custom preauth stuff here
        parent::checkPreAuth($user);
    }
}
于 2013-09-20T14:17:22.113 回答
7

security.user_checker你可以在你的 bundle中重新定义 Symfony 的用户检查服务( ):

# 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()

于 2015-01-20T11:01:39.060 回答
0

Why not attach event listener to the kernel.request event and watch if the current logged user has accepted the latest EULA?

To get the current user you can use something like this:

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

$user = $securityContext->getToken()->getUser();
于 2012-06-19T16:30:01.497 回答