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

Kam*_*ari 9 authentication eula symfony doctrine-orm

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

场景是:

  1. 用户创建新帐户并接受eula.
  2. Eula得到更新
  3. 用户试图登录,但他没有接受最新的eula
  4. 用户获得相同的登录表单,但附加字段"接受最新的eula"
  5. 用户登录和系统插入信息:当前日期和时间,用户ID,Eula id以跟踪eula接受度.

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

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

Fat*_*moo 8

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

config.yml

parameters:
    security.user_checker.class: Acme\Bundle\UserBundle\Security\UserChecker
Run Code Online (Sandbox Code Playgroud)

Userchecker:

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


gtb*_*gtb 6

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

# services.yml
security.user_checker:
    class: MyBundle\Checker\UserChecker
    arguments: [ "@some.service", "%some.param%" ]
Run Code Online (Sandbox Code Playgroud)

然后扩展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
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Nik*_*ski 0

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

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

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

$user = $securityContext->getToken()->getUser();
Run Code Online (Sandbox Code Playgroud)