FOSUserbundle上默认禁用用户

问题描述 投票:0回答:2

我正在使用FOSUserBundle,我想在每个用户注册时默认禁用。管理员将通过电话联系每个用户,如果合适,他将使用户处于活动状态。我已经阅读了有关覆盖默认FOSUserBundle控制器但我无法弄清楚如何使其工作。我在src / AppBundle / Controller / RegistrationController.php中使用此方法创建了RegistrationController.php:

<?php

/*
 * This file is part of the FOSUserBundle package.
 *
 * (c) FriendsOfSymfony <http://friendsofsymfony.github.com/>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace FOS\UserBundle\Controller;

use Symfony\Component\DependencyInjection\ContainerAware;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\Exception\AccountStatusException;
use FOS\UserBundle\Model\UserInterface;

/**
 * Controller managing the registration
 *
 * @author Thibault Duplessis <[email protected]>
 * @author Christophe Coevoet <[email protected]>
 */
class RegistrationController extends ContainerAware
{
    /**
     * Receive the confirmation token from user email provider, login the user
     */
    public function confirmAction($token)
    {
        $user = $this->container->get('fos_user.user_manager')->findUserByConfirmationToken($token);

        if (null === $user) {
            throw new NotFoundHttpException(sprintf('The user with confirmation token "%s" does not exist', $token));
        }

        $user->setConfirmationToken(null);
        $user->setEnabled(false);
        $user->setLastLogin(new \DateTime());

        $this->container->get('fos_user.user_manager')->updateUser($user);
        $response = new RedirectResponse($this->container->get('router')->generate('fos_user_registration_confirmed'));
        $this->authenticateUser($user, $response);

        return $response;
    }
}

,但没有任何作用,也许我需要有人向我展示如何做到这一点,仅此而已。

symfony fosuserbundle
2个回答
1
投票

对于那些仍在努力解决这个问题的人,设置一个观察者来监听事件:fos_user.registration.initialize这样(改编你的代码路径):

    app.listener.disable_registered_user:
            class: AppBundle\Observer\DisableRegisteredUserListener
            arguments:
                - "@templating"
            tags:
                # split to multiple line for readability
                # can be made into a single line like - { name: ..., event: ... , method: ... }
                -
                    name: "kernel.event_listener"
                    event: "fos_user.registration.initialize"
                    method: "disableUser"

那么这是您的事件监听器类的内容:

namespace AppBundle\Observer;

use FOS\UserBundle\Event\GetResponseUserEvent;

/**
 * Class DisableRegisteredUserListener
 * @package AppBundle\Observer
 */
class DisableRegisteredUserListener
{
    /**
     * @param \FOS\UserBundle\Event\GetResponseUserEvent $event
     */
    public function disableUser(GetResponseUserEvent $event)
    {
        $user = $event->getUser();
        /** @var \AppBundle\Entity\User $user */
        $user->setEnabled(false);
    }
}

-1
投票

你可以只听FOSUserEvents::REGISTRATION_CONFIRM并再次禁用注册用户,然后再将其保存到数据库。

由于FOSU​​serBundle会自动将新用户转发到需要用户登录的confirmedAction,因此您需要提供自己的响应来覆盖此用户。

你的听众......

class DisableRegisteredUserListener
{
    /**
     * @var EngineInterface
     */
    private $templating;

    /**
     * @var EngineInterface $templating
     */
    public function __construct(EngineInterface $templating)
    {
        $this->templating = $templating;
    }

    /**
     * @var GetResponseUserEvent $event
     * @return null
     */
    public function disableUser(GetResponseUserEvent $event)
    {
        $user = $event->getUser();
        $user->setEnabled(false);

        $response = $this->templating->renderResponse(
            'AppBundle:Registration:registration_complete.html.twig',
            array(
                'user' => $user,
            )
        );
    }
}

您的服务文件(YAML)......

services:
    app.listener.disable_registered_user:
        class: AppBundle\EventListener\DisableRegisteredUserListener
        arguments:
            - "@templating"
        tags:
            # split to multiple line for readability
            # can be made into a single line like - { name: ..., event: ... , method: ... }
            -
                name: "kernel.event_listener"
                event: "fos_user.registration.confirm"
                method: "disableUser"

然后,您的AppBundle:Registration:registration_complete.html.twig可用于告诉新用户他们的帐户已创建但已禁用,然后您的团队成员会联系他们以完成此过程。

© www.soinside.com 2019 - 2024. All rights reserved.