2012-03-29 24 views
1

Ich möchte eine Methode in einer Sitzung beanspruchten Backing Bean aufgerufen werden, nachdem sich ein Benutzer anmeldet. Wie kann ich das tun?Spring-Sicherheit und JSF: Aufruf-Methode beim Bean-Backing Bean?

Umgebung: Spring Security 3.0.x, Spring 3.0.x und JSF 1.2. Die Backing-Beans werden von Spring verwaltet.

Hintergrund: Sitzungen werden auch ohne Anmeldung erstellt. Meine sitzungsabhängige Bean enthält Einstellungen, die anfänglich auf Standardwerte festgelegt sind. Nach der Anmeldung möchte ich den Sitzungsstatus auf die Einstellungen aktualisieren, die in der Datenbank für diesen bestimmten Benutzer gespeichert sind. Um das zu erreichen, stellte ich mir eine Schnittstelle vor oder noch einfacher eine annotierte Methode (z.B. @PostLogin), aber bis jetzt habe ich nichts dergleichen gefunden.

Es wäre in Ordnung, wenn diese Methode bei jeder grundlegenden Änderung, d. H. Auch beim Abmelden, aufgerufen wird. Es wäre auch akzeptabel, wenn die gesamte Bean bei der Anmeldung zerstört und neu erstellt würde, obwohl meine anderen Session-übergreifenden Beans überleben sollten.

Was ich bisher gefunden ist:

  • ApplicationListener <AuthenticationSuccessEvent>: Der Hörer muss offenbar sein Anwendung scoped, und ich kann keinen Zugriff bekommen auf meine Session-Bean scoped drin. @Autowired plus Bereichsproxy funktioniert nicht. Das injizierte Objekt ist defekt. Es enthält seine Abhängigkeiten nicht, obwohl die reale Backing-Bean dies tut.
  • < Formular-Login-Authentifizierung-success-handler-ref = ".." >: habe nicht versucht, aber ich muss die Methode unabhängig von der verwendeten Login-Prozedur aufgerufen werden. Anders als Formular basiert unterstützen wir erinnern mich und programmatische Anmeldung (z. B. automatisch nach Passwort vergessen Prozess angemeldet).

Antwort

2

meine eigene Frage zu beantworten:

ApplicationListener war die richtige Spur, aber @Autowired war es nicht.

Ich habe eine Schnittstelle mit einer Methode definiert, die von meiner Session-Bean implementiert wird. Die (Singleton-Bereich) Ereignis-Listener-Klasse verwendet dann ApplicationContext.getBeansOfType(..), um die Session-Beans von dieser Schnittstelle zu finden, und ruft die Methode der Schnittstelle für jede von ihnen auf.