Symfony2 FOSUserBundle - проверять флажок «user active» при входе в систему

У моих пользователей есть флаг «активный», и если он установлен на ноль или ноль, я не разрешу вход в систему.

Я попробовал пару подходов и потерпел неудачу.

Если я делаю маршрут выхода из системы, флэш-сообщение не сохраняется, поэтому пользователь ничего не видит.

Я смотрел на добавление проверки в форме входа в систему, чтобы она вызвала обычную ошибку формы, если флаг не был установлен в true, но в этой папке (vendor / Bundles / FOS / UserBundle / Form / Type) я ничего не нахожу для входа форма, только регистрация и тому подобное, поэтому я не знаю, где ее поместить или где наследовать, чтобы переопределить.

Я также попытался, как предложили здесь, вручную выйти из системы, но у меня остался белый экран смерти ...

Любые предложения, как легко это сделать?

************** ОБНОВИТЬ************

Я понял, что я, вероятно, хочу сделать это, добавив валидатор в форму входа. В настоящее время он закодирован в контроллере первого маршрута, на который отправляется пользователь, но это не обеспечит большую безопасность, если пользователь вводит маршрут перед входом в систему, потому что при успешной попытке входа моя «целевая страница» по умолчанию после логин не будет маршрутом, по которому проходит пользователь, но он будет приземляться на выбранном им маршруте ...

***ОБНОВЛЕНИЕ СНОВА****

Таким образом, файл конфигурации службы имеет это ...

    <service id="security.user_checker" class="%security.user_checker.class%" public="false" />

И этот параметр определен здесь ...

    <parameter key="security.user_checker.class">Symfony\Component\Security\Core\User\UserChecker</parameter>

Таким образом, чтобы изменить логику входа в систему, мне нужно переопределить

Symfony\Component\Security\Core\User\UserChecker

Теперь я сделал это, переопределив этот параметр выше в моем собственном файле parameters.ini в приложении / конфигурации symfony, например так:

security.user_checker.class  = BizTV\UserBundle\Controller\UserChecker

.. и добавил эту проверку к моей переопределению userChecker ...

    //Test for companylock...
    if ( !$user->getCompany()->getActive() ) {
        throw new LockedException('The company of this user is locked.', $user);
    }

Вот весь файл:

<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <[email protected]>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

//Override by Mattias

namespace BizTV\UserBundle\Controller;
//namespace Symfony\Component\Security\Core\User;

use Symfony\Component\Security\Core\Exception\CredentialsExpiredException;
use Symfony\Component\Security\Core\Exception\LockedException;
use Symfony\Component\Security\Core\Exception\DisabledException;
use Symfony\Component\Security\Core\Exception\AccountExpiredException;

use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserChecker as OriginalUserChecker;

/**
 * UserChecker checks the user account flags.
 *
 * @author Fabien Potencier <[email protected]>
 */
class UserChecker extends OriginalUserChecker
{
    /**
     * {@inheritdoc}
     */
    public function checkPreAuth(UserInterface $user)
    {

    //Test for companylock...
    if ( !$user->getCompany()->getActive() ) {
        throw new LockedException('The company of this user is locked.', $user);
    }

        if (!$user instanceof AdvancedUserInterface) {
            return;
        }

        if (!$user->isCredentialsNonExpired()) {
            throw new CredentialsExpiredException('User credentials have expired.', $user);
        }


    }

    /**
     * {@inheritdoc}
     */
    public function checkPostAuth(UserInterface $user)
    {

    //Test for companylock...
    if ( !$user->getCompany()->getActive() ) {
        throw new LockedException('The company of this user is locked.', $user);
    }  

        if (!$user instanceof AdvancedUserInterface) {
            return;
        }



        if (!$user->isAccountNonLocked()) {
            throw new LockedException('User account is locked.', $user);
        }

        if (!$user->isEnabled()) {
            throw new DisabledException('User account is disabled.', $user);
        }

        if (!$user->isAccountNonExpired()) {
            throw new AccountExpiredException('User account has expired.', $user);
        }
    }
}

* Обновление № 3******** Теперь мне осталось только сделать так, чтобы он на самом деле проверял стандартную блокировку пользователя, что, на удивление, не дает ничего из коробки. (Спасибо, NIFR, за то, что вы так далеко зашли!)

Моя пользовательская сущность начинается следующим образом, и, как сказал Nifr, мне нужно реализовать AdvancedUserInterface, но, вероятно, это не тот способ, так как он все еще не проверяет эту блокировку ... но он не выдает мне сообщение об ошибке либо (если я изменяю их и помещаю Implemenmts AdvancedUserInterface, а затем расширяет baseUser, он выдает ошибку, так что ...)

<?php
// src/BizTV/UserBundle/Entity/User.php

namespace BizTV\UserBundle\Entity;

use BizTV\UserBundle\Validator\Constraints as BizTVAssert;
use Symfony\Component\Security\Core\User\AdvancedUserInterface;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

use BizTV\BackendBundle\Entity\company as company;

/**
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser implements AdvancedUserInterface
{

Не уверен, что именно так вы и делаете, когда вы оба расширяете базового пользователя и пытаетесь реализовать AdvancedUserInterface, когда все сделано, как описано выше, я все еще не могу использовать функции, которые он должен добавить (но это также не выдает мне сообщения об ошибке), но если я поменяйте местами РАСШИРЕНИЯ и РЕАЛИЗАЦИИ, как это (строка 18) ...

class User implements AdvancedUserInterface extends BaseUser 

... я получаю эту ошибку:

Parse error: syntax error, unexpected T_EXTENDS, expecting '{' in /var/www/cloudsign/src/BizTV/UserBundle/Entity/User.php on line 18

Ответы на вопрос(1)

Ваш ответ на вопрос