Symfony2 FOSUserBundle - Validar contra el indicador "usuario activo" en el inicio de sesión

Tengo una marca en mis usuarios para "activo" y, si se establece en cero o nulo, no permitiré el inicio de sesión.

He intentado un par de enfoques y quedé corto.

Si hago la ruta de cierre de sesión, el mensaje flash no se conserva, por lo que el usuario no ve nada.

Intenté agregar una validación en el formulario de inicio de sesión para que arrojara un error de formulario normal si el indicador no estaba establecido en verdadero, pero en esa carpeta (proveedor / Paquetes / FOS / UserBundle / Form / Type) no encuentro nada para iniciar sesión formulario, solo registro y demás, por lo que no sabría dónde ponerlo ni de dónde heredarlo para anularlo.

También intenté como se sugiere aquí para cerrar sesión manualmente, pero eso me dejó con una pantalla blanca de la muerte ...

¿Alguna sugerencia de cómo lograr esto fácilmente?

************** ACTUALIZAR************

Me di cuenta de que probablemente quiera hacerlo agregando un validador en el formulario de inicio de sesión. Actualmente lo tengo codificado en el controlador de la primera ruta a la que se envía un usuario, pero eso no proporcionará mucha seguridad si el usuario escribe una ruta antes de iniciar sesión, porque en un intento de inicio de sesión exitoso, mi "página de destino" predeterminada después de el inicio de sesión no será la ruta a la que se toma el usuario, pero aterrizará en la ruta que elija ...

***ACTUALIZAR DE NUEVO****

Así que el archivo de configuración de servicio tiene esto ...

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

Y ese parámetro se define aquí ...

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

Así que para modificar las lógicas de inicio de sesión necesito anular

Symfony\Component\Security\Core\User\UserChecker

Ahora he hecho eso al anular ese parámetro arriba en mis propios parameters.ini en la aplicación / config de Symfony como esta

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

.. y agregué esta verificación a mi anulador de userChecker ...

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

Aquí está el archivo completo:

<?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);
        }
    }
}

* Actualizar nb 3******** Ahora solo me queda hacer que realmente compruebe el bloqueo de usuario estándar que, sorprendentemente, no lo hace de forma inmediata. (Gracias nifr por llevarme tan lejos!)

Mi entidad de usuario comienza así, y como dijo Nifr, necesito implementar el Interfaz de Usuario Avanzado, pero probablemente esta no sea la forma de hacerlo ya que todavía no se comprueba este bloqueo ... pero no me muestra ningún mensaje de error o bien (si los cambio y pongo implememts AdvancedUserInterface y luego EXTENDs baseUser arroja un error, así que ...)

<?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
{

No estoy seguro si es así como lo hace cuando ambos extienden el usuario base e intentan implementar AdvancedUserInterface, cuando se hace como se indica anteriormente, todavía no puedo usar las funciones que se supone que debo agregar (pero tampoco me muestra ningún mensaje de error), pero si cambiar lugares de las EXTENSAS y las IMPLEMENTACIONES como esta (línea 18) ...

class User implements AdvancedUserInterface extends BaseUser 

... me sale este error

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta