2012-10-09 2 views
7

Ich habe eine erfolgreich implementiert, aber jetzt muss ich auch "Remember me" -Funktion hinzufügen, und ich konnte keine Dokumente finden, wie man das macht.Wie konfiguriere ich einen Empfänger, der sich in Symfony 2 erinnert?

habe ich versucht, das Hinzufügen dieses:

remember_me: 
    key: "%secret%" 
    lifetime: 31536000 # 1 year 
    always_remember_me: true 

Aber es sagt dies:

You must configure at least one remember-me aware listener (such as form-login) for each firewall that has remember-me enabled.

ich das gefunden, aber ich bin nicht sicher, wie es zu benutzen: Symfony\Component\Security\Core\Authentication\Provider\RememberMeAuthenticationProvider

So Wo ist die RememberMeAwareInterface? (Ich denke, es gibt einen? Wie ContainerAware) Und was soll ich damit machen?

Ich glaube nicht, dass ich meine eigene Implementierung schreiben muss, die Standard sollte mit meinem benutzerdefinierten Auth-Provider funktionieren.

Antwort

4

Ich hatte das gleiche Problem mit einem benutzerdefinierten Facebook-Authentifizierungsanbieter, den ich schrieb. Die Lösung endete ziemlich simpel:

Ich nehme an, Sie haben einen benutzerdefinierten Authentifizierungsanbieter mit einer benutzerdefinierten SecurityFactoryInterface Implementierung implementiert, die von Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\AbstractFactory erstreckt. Wenn Sie das getan hat, der Rest ist eine Frage der Konfiguration:

  1. In der Sicherheitskonfiguration, konfigurieren Sie die remember_me Funktionalität für Ihre Firewall. Unter der Annahme, dass in den public Firewall gerade konfigurieren, könnten die zusätzlichen Konfigurationsparameter erstellt wie folgt aussehen:

    firewalls: 
        public: 
         remember_me: 
          key:  "%secret%" 
          lifetime: 31536000 # 365 days in seconds 
          path: /
          domain: ~ # Defaults to the current domain from $_SERVER 
    
  2. In der gleichen Konfiguration, die Remember_Me Funktionalität für Authentifizierungs-Provider aktivieren. Unter der Annahme, dass in den public Firewall sind die Konfiguration und SecurityFactoryInterfacegetKey() Methode Implementierung liefert yourAuthProviderKey, könnten die zusätzlichen Konfigurationsparameter erstellt wie folgt aussehen:

    firewalls: 
        public: 
         yourAuthProviderKey: 
          remember_me:  true 
    
  3. Schließlich, wenn Ihr Authentifizierungsanbieter Anmeldungen behandelt, stellen Sie sicher, Sie anfordern Die Funktion merkt sich, indem Sie in der HTTP-Anforderung einen http GET- oder POST-Parameter mit dem Namen _remember_me mit dem Wert 1 haben. (Beachten Sie jedoch: Dieser Parameter benötigt möglicherweise einen anderen Namen, wenn Sie den Standardwert in Ihrer Sicherheitskonfiguration ändern.) In meinem Fall musste ich beispielsweise Facebook anweisen, nach der Authentifizierung die folgende URL umzuleiten: http://www.mydomain.com/auth-callback/?_remember_me=1. (Beachten Sie den Teil nach dem ?)

Hoffe, das hilft!

+1

Für alle anderen von Google kommen Dinge wie Remember Me und Referer nur funktionieren, wenn Ihre getPosition() in der Klasse von AbstractFactory eine Position, die zu spät ist, zurückgibt genug in der Pipeline. Ich konnte keine genauen Beschreibungen der verschiedenen akzeptierten Zeichenketten finden, aber z. 'pre_auth' ist zu früh, um mich und den Referer daran zu erinnern, automatisch zu arbeiten, aber 'form' funktioniert gut. –

2

Haben Sie das zu Ihrer form_login Sektion hinzugefügt?

+0

Nein, ich habe keins. Ich verwende meinen eigenen Auth-Provider 'NoPasswordProvider', die Benutzer melden sich über einen einmaligen Link an, der an ihre E-Mail-Adresse gesendet wird. Also in meiner Firewall, anstelle von form_login, habe ich 'nopassword: true' – ChocoDeveloper

0

Sie können dies versuchen:

firewalls:     
    secured_area: 
     pattern: ^/ 
     anonymous: ~ 
     form_login: 
      csrf_provider: form.csrf_provider 
      login_path: login 
      check_path: login_check 
      always_use_default_target_path: true 
      default_target_path: /the-cao 
      remember_me: true 
     logout: 
      path: /logout 
      target:/
     remember_me: 
      key:  "%secret%" 
      lifetime: 31536000 # 365 days in seconds 
      path: /
      domain: ~ # Defaults to the current domain from $_SERVER 
1

Von Symfony 2.8, der "Schlüssel" wird durch "geheime" ersetzt.So haben Sie:

remember_me: 
    secret: %secret% 
    lifetime: 31536000 

Wenn Sie auf diesen Fehler laufen, das ist das fix

0

In meinem Fall ist es passiert ist, als mache ich eigentlich eine Factory-Klasse SecurityFactoryInterface Implementierung (wie es in Beispiel beschrieben wurde „, wie man Erstellen Sie einen benutzerdefinierten Authentifizierungsanbieter "). Später fand ich heraus, dass eine andere Möglichkeit, diese Factory zu erstellen, von AbstractFactory ausgeht, welches die notwendigen Readme-Dateien enthält (Sie können es mit create() -Methode finden). Es gibt also zwei Lösungen: 1) Erweiterung von AbstractFactory statt Implementierung von SecurityFactoryInterface 2) Implementierung von SecurityFactoryInterface und copypaste Readme-bezogenem Code. In symfony 3.1:

 // add remember-me aware tag if requested 
    if ($this->isRememberMeAware($config)) { 
     $container 
      ->getDefinition($listenerId) 
      ->addTag('security.remember_me_aware', array('id' => $id, 'provider' => $userProviderId)) 
     ; 
    } 
Verwandte Themen