Symfony2 FOSUserBundle - Überprüfung anhand der Markierung "Benutzer aktiv" bei der Anmeldung

Ich habe ein Flag für "Aktiv" auf meinen Benutzern und wenn es auf Null oder Null gesetzt ist, erlaube ich keine Anmeldung.

Ich habe ein paar Ansätze ausprobiert und bin zu kurz gekommen.

Wenn ich mich abmelde, bleibt die Flash-Nachricht nicht erhalten, sodass der Benutzer nichts sieht.

Ich habe versucht, dem Anmeldeformular eine Validierung hinzuzufügen, damit es einen normalen Formularfehler auslöst, wenn das Flag nicht auf true gesetzt ist, aber in diesem Ordner (Hersteller / Bundles / FOS / UserBundle / Form / Type) finde ich nichts für die Anmeldung Formular, nur Registrierung und so, also würde ich nicht wissen, wo ich es ablegen soll oder woher ich es erben soll, um es zu überschreiben.

Ich habe auch wie hier vorgeschlagen versucht, mich manuell abzumelden, aber das hat mich mit einem weißen Bildschirm des Todes zurückgelassen ...

Irgendwelche Vorschläge, wie man dies einfach bewerkstelligt?

************** AKTUALISIEREN************

Ich habe festgestellt, dass ich wahrscheinlich einen Validator auf dem Anmeldeformular hinzufügen möchte. Ich habe es derzeit in den Controller der ersten Route codiert, an die ein Benutzer gesendet wird, aber das bietet keine große Sicherheit, wenn ein Benutzer eine Route vor dem Anmelden eingibt, da bei einem erfolgreichen Anmeldeversuch meine Standard- "Landing Page" danach lautet login ist nicht die Route, zu der der Benutzer geführt wird, sondern er landet auf der Route seiner Wahl ...

***UPDATE WIEDER****

Die Dienstkonfigurationsdatei hat also Folgendes:

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

Und dieser Parameter wird hier definiert ...

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

Um die Anmeldelogik zu ändern, muss ich sie überschreiben

Symfony\Component\Security\Core\User\UserChecker

Jetzt habe ich dies getan, indem ich diesen Parameter in meiner eigenen parameters.ini in der symfony-App / config wie folgt überschrieben habe

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

.. und habe diese Prüfung meinem userChecker-Overrider hinzugefügt ...

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

Hier ist die gesamte Datei:

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

* Update Nr. 3******** Jetzt muss ich nur noch prüfen, ob es sich um eine Standardbenutzersperre handelt, die überraschenderweise nicht sofort einsatzbereit ist. (Danke nifr, dass du mich so weit gebracht hast!)

Meine Benutzerentität startet wie folgt und wie Nifr sagte, muss ich das AdvancedUserInterface implementieren, aber dies ist wahrscheinlich nicht der Weg, da es immer noch nicht nach dieser Sperre sucht ... aber es gibt keine Fehlermeldung aus entweder (wenn ich sie ändere und implememts AdvancedUserInterface und dann EXTENDs baseUser lege, wirft es so einen Fehler ...)

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

Ich bin mir nicht sicher, ob Sie dies tun, wenn Sie sowohl den Basisbenutzer erweitern als auch AdvancedUserInterface implementieren. Wenn Sie dies wie oben tun, kann ich die Funktionen, die hinzugefügt werden sollen, immer noch nicht verwenden (aber es gibt auch keine Fehlermeldung aus) wechsle die Plätze der EXTENDS und IMPLEMENTS wie folgt (Zeile 18) ...

class User implements AdvancedUserInterface extends BaseUser 

... ich bekomme diesen Fehler:

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage