Symfony2 FOSUserBundle - Valida contra o sinalizador "usuário ativo" no login

Eu tenho um sinalizador em meus usuários para 'ativo' e se definido como zero ou nulo, não permitirei login.

Eu tentei algumas abordagens e acabei curto.

Se eu fizer a rota de logout, a mensagem flash não será preservada, para que o usuário não veja nada.

Eu olhei para adicionar uma validação no formulário de login para que ele iria lançar um erro de formulário normal se o sinalizador não foi definido como true, mas nessa pasta (fornecedor / Bundles / FOS / UserBundle / Form / Type) não encontro nada para login forma, apenas registro e tal, então eu não sei onde colocá-lo ou onde herdar a fim de substituir.

Eu também tentei como sugerido aqui para sair manualmente, mas isso me deixou com uma tela branca da morte ...

Alguma sugestão de como conseguir isso facilmente?

************** ATUALIZAR************

Percebi que provavelmente gostaria de adicionar um validador no formulário de login. Atualmente, tenho isso codificado no controlador da primeira rota para a qual um usuário é enviado, mas isso não fornecerá muita segurança se um usuário digitar uma rota antes de efetuar login, porque em uma tentativa de login bem-sucedida, minha "página de aterrissagem" padrão após login não será a rota que o usuário é levado, mas ele vai pousar na rota de sua escolha ...

***ATUALIZE NOVAMENTE****

Então o arquivo de configuração do serviço tem isso ...

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

E esse parâmetro é definido aqui ...

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

Então, para modificar as lógicas de login, eu preciso substituir

Symfony\Component\Security\Core\User\UserChecker

Agora eu fiz isso substituindo o parâmetro acima no meu próprio parameters.ini no symfony app / config assim

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

.. e adicionei esta verificação ao meu userchecker overrider ...

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

Aqui está o arquivo inteiro:

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

* Atualizar nb 3******** Agora eu só resta para fazer isso realmente verificar o bloqueio de usuário padrão que surpreendentemente não faz fora da caixa. (Obrigado nifr por me levar tão longe!)

Minha entidade de usuário começa assim, e como Nifr disse, eu preciso implementar o AdvancedUserInterface, mas esta provavelmente não é a maneira de fazê-lo, uma vez que ainda não verifica esse bloqueio ... mas não me lança nenhuma mensagem de erro ou (se eu alterá-los e colocar implememts AdvancedUserInterface e, em seguida, ESTENDER baseUser ele gera um erro assim ...)

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

Não tenho certeza se é assim que você faz quando estende o usuário base e tenta implementar AdvancedUserInterface, quando feito como acima, eu ainda não posso usar os recursos que ele deveria adicionar (mas também não há mensagem de erro), mas se eu trocar lugares dos EXTENDS e IMPLEMENTOS como este (linha 18) ...

class User implements AdvancedUserInterface extends BaseUser 

... eu recebo este erro:

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

questionAnswers(1)

yourAnswerToTheQuestion