如何捕获没有用户名的用户?

时间:2012-11-19 13:15:11

标签: symfony doctrine-orm fosuserbundle

我正在将相当大的社区迁移到symfony2。当前用户表包含许多用户名中包含非字母数字字符的用户。在新版本中,我只允许[a-zA-Z0-9-]获得每个用户的语义URL等好处。

是否可以捕获使用电子邮件/通行证登录且未设置用户名的用户?我希望他们重定向到一个页面,他们可以重新选择用户名。棘手的部分:除非他们拥有正确的用户名,否则他们不应该触摸网站上的任何内容。

我想到了一个事件,来自fosuserbundle,但我找不到合适的事件。

2 个答案:

答案 0 :(得分:1)

您可以使用活动。请在此处查看示例:http://symfony.com/doc/2.0/cookbook/event_dispatcher/before_after_filters.html

当然,事件监听器应忽略更改用户名的操作。就像登录和其他匿名操作一样。

您可以通过设置事件响应来返回任何响应,包括重定向。

答案 1 :(得分:0)

只是一个想法。 AOP范例(JMSAopBundle)怎么样?为您的控制器定义切入点(登录控制器除外):

class PrivateEntityInformationPointcut implements PointcutInterface
{

    public function matchesClass(\ReflectionClass $class)
    {
        return $class->isSubclassOf('Your\Controller\Superclass')
            && $class->name !== 'Your\Controller\Access';
    }

    public function matchesMethod(\ReflectionMethod $method)
    {
        return true; // Any method
    }

}

然后拦截器应该重定向到用于设置用户名的页面:

class DenyEntityAccessInterceptor implements MethodInterceptorInterface
{

    private $securityContext;

    private $logger;

    /**
     * @DI\InjectParams({
     *     "securityContext" = @DI\Inject("security.context"),
     *     "logger"          = @DI\Inject("logger"),
     * })
     */
    public function __construct(SecurityContext $securityContext,
        Logger $logger)
    {
        $this->securityContext = $securityContext;
        $this->logger          = $logger;
    }

    public function intercept(MethodInvocation $invocation)
    {
        // Check username, redirect using the router, log what's happening

        // It's OK
        return $invocation->proceed();
    }

}