Symfony2 FOSUserBundle - waliduj z flagą „użytkownik aktywny” przy logowaniu

Mam flagę na moich użytkownikach dla „aktywnych”, a jeśli ustawiona na zero lub null, nie pozwolę na logowanie.

Spróbowałem kilku podejść i wyszedłem krótko.

Jeśli wykonam trasę wylogowania, wiadomość flash nie jest zachowywana, więc użytkownik nic nie widzi.

Spojrzałem na dodanie sprawdzania poprawności w formularzu logowania, tak aby rzucił błąd normalnej formy, jeśli flaga nie została ustawiona na true, ale w tym folderze (sprzedawca / pakiety / FOS / UserBundle / Form / Type) Nie znajduję nic do logowania formularz, tylko rejestracja i tak dalej, więc nie wiedziałbym, gdzie go umieścić, ani skąd dziedziczyć, aby zastąpić.

Spróbowałem również ręcznie wylogować się, ale pozostawiło mi to biały ekran śmierci ...

Wszelkie sugestie, jak łatwo to osiągnąć?

************** AKTUALIZACJA************

Zdałem sobie sprawę, że prawdopodobnie chcę to zrobić dodając walidator na formularzu logowania. Obecnie zakodowałem go w kontrolerze pierwszej trasy, do której zostanie wysłany użytkownik, ale nie zapewni to większego bezpieczeństwa, jeśli użytkownik wpisze trasę przed zalogowaniem, ponieważ przy udanej próbie logowania moja domyślna „strona docelowa” po login nie będzie trasą, do której użytkownik zostanie przeniesiony, ale będzie lądował na wybranej trasie ...

***AKTUALIZUJ PONOWNIE****

Plik konfiguracyjny usługi ma to ...

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

Ten parametr jest tutaj zdefiniowany ...

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

Aby zmodyfikować logikę logowania, muszę to zmienić

Symfony\Component\Security\Core\User\UserChecker

Teraz zrobiłem to, zastępując powyższy parametr w moich parametrach.ini w aplikacji / config symfony w ten sposób

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

.. i dodałem to sprawdzenie do mojego overridera ...

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

Oto cały plik:

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

* Aktualizacja nb 3******** Teraz pozostało mi tylko sprawić, żeby rzeczywiście sprawdzał standardową blokadę użytkownika, co zaskakująco nie działa po wyjęciu z pudełka. (Dziękuję, że dotarłem tak daleko!)

Moja encja użytkownika zaczyna się w ten sposób i, jak powiedział Nifr, muszę zaimplementować interfejs AdvancedUserInterface, ale prawdopodobnie nie jest to możliwe, ponieważ nadal nie sprawdza tej blokady ... ale nie wysyła mi komunikatu o błędzie albo (jeśli zmienię je i umieścisz implememts AdvancedUserInterface, a następnie EXTENDs baseUser, zgłasza błąd, więc ...)

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

Nie jestem pewien, czy w ten sposób robisz to, gdy zarówno rozszerzasz użytkownika podstawowego, jak i próbujesz zaimplementować interfejs AdvancedUserInterface, kiedy to zrobisz, jak powyżej, nadal nie mogę używać funkcji, które ma dodawać (ale nie zgłasza mi żadnego komunikatu o błędzie), ale jeśli ja przełączaj miejsca EXTENDS i IMPLEMENTS w ten sposób (linia 18) ...

class User implements AdvancedUserInterface extends BaseUser 

... Dostaję ten błąd:

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

questionAnswers(1)

yourAnswerToTheQuestion