2012-06-14 5 views
7

Ich habe eine Anwendung in JBoss AS6 ausgeführt. Die Authentifizierung funktioniert mit der Authentifizierungsmethode "FORM", und der Benutzer meldet sich korrekt an.Abrufen von Login-Ereignissen in JBoss AS 6

Ich möchte in der Lage sein, ein Stück Gewohnheit zu nennen, statischen Code, wenn ein Benutzer erfolgreich anmeldet.

Leider kann ich keine Zuhörer, oder Haken oder Rückruf finden, der Code auf erfolgreich ausgeführt wird Anmeldung. Der HttpSessionListener hat ein Ereignis für "sessionCreated", aber dieser wird aufgerufen, sobald ein Benutzer auf eine Seite zugreift, auch wenn sie sich nicht erfolgreich angemeldet haben. Das Anzeigen das Login-Formular löst das Ereignis aus.

Kann mir jemand auf eine Dokumentation für JBoss AS 6 (oder gleichwertig) verweisen, die zeigt, wie man benutzerdefinierten Code an dem Punkt ausführt, an dem sich ein Benutzer zum ersten Mal erfolgreich anmeldet?

Vielen Dank im Voraus.

+0

Frühling 'acegi' bietet Haken und Veranstaltungen für eine erfolgreiche An- und Abmeldungen, aber nicht sicher, ob ein einfache Lösung mit "JAAS", abgesehen von Workarounds.Wenn du zu acegi im Frühling wechseln kannst, wäre es einfacher. –

+0

@ Rp- Leider gibt es in diesem Anwendungsstapel keinen Spring, und angesichts der Tatsache, dass Spring und JBoss EJB nicht sehr gut zusammenspielen, würde ich lieber nicht diesen Pfad gehen ... – Erica

+0

Die Problemumgehung, die ich denken kann, ist ein 'CustomFormAuthenticator', der' org.apache.catalina.authenticator.FormAuthenticator' erweitert und ihn in '/ server/default/deployers/jbossweb.deployer/META-INF/war-deployer-jboss-beans.xml 'registriert. Jetzt haben sie in Jboss AS 7 das 'valve' Konzept eingeführt, wo Sie' CustomAuthenticator' in jboss-web.xml selbst registrieren können. –

Antwort

3

Sie können eine Implementierung vor dem gesicherten Servlet hinzufügen.

Bei jedem Aufruf testet der Filter ein boolesches Flag notFirstCall in HttpSession.

Wenn das Flag nicht vorhanden ist, ist die Anfrage die erste nach der Anmeldung des Benutzers. Es kann den angegebenen Job aufrufen und dann das Flag notFirstCall setzen, um den Job als erledigt für diese Sitzung zu markieren.

+0

Dies ist einfach und umweltverträglich, und am wichtigsten funktioniert es, also markiere ich als akzeptierte Antwort. Es ist eine Schande, dass es in JBoss keine elegantere Lösung gibt. – Erica

1

Was ist mit etwas wie javax.servlet.http.HttpSessionBindingListener? Erstellen Sie ein Objekt, füllen Sie es wie gewünscht, wenn ein Benutzer sich erfolgreich anmeldet, und fügen Sie es als Attribut zur Benutzersitzung hinzu. Also:

public class User implements Serializable, HttpSessionBindingListener { 
private String userId; 
private Timestame logonTime; 
// any additional fields 

@Override 
public void valueBound(HttpSessionBindingEvent event) { 
// this method called when this object is attached to a session 
    log.debug("user " + this.userId + "bound to a session - user logged in"); 
// do stuff 
    } 
@Override 
    public void valueUnbound(HttpSessionBindingEvent event) { 
// this method called when user's session ends, value unbound, etc 
    log.debug("user " + this.userId + "logged off"); 
// do other stuff 
    } 

} 

das Objekt zu binden:

// you don't create this object until a user logs in 
User userObject = new User(); 
userObject.setUserId(); 
userObject.setLogonTime(); 
// get your request object however you normally get it 
HttpServletRequest request.getSession().setAttribute("loggedInUser", userObject); 

Wenn das Attribut gesetzt wird, wird es die Methode valueBound nennen Dies auch nützlich sein können für die Benutzer-Tracking (speichern auf log/off Info db usw.).

+1

das Problem mit dieser Lösung ist, dass ich noch irgendwo den zweiten Code eingeben muss. Es muss aufgerufen werden, wenn sich der Benutzer anmeldet, aber ich habe keinen solchen Ort. Sie erwähnen, dass das Objekt erst erstellt wird, wenn sich ein Benutzer anmeldet. Wie kann ich feststellen, wann sich der Benutzer anmeldet? Mit diesem Frageticket ging ich dorthin. – Erica

+0

Soweit ich verstehe, sollte der zweite Teil des Codes in einem Servlet-Filter platziert werden ... –

+1

@YvesMartin - Putting es in einen Servlet-Filter würde dazu führen, dass jedes Mal * eine Ressource zugegriffen wurde, nicht nur die erstmal nach erfolgreichem Login ... Oder habe ich das falsch verstanden? – Erica

2

Die Problemumgehung, die ich mir vorstellen kann, ist ein CustomFormAuthenticator, der org.apache.catalina.authenticator.FormAuthenticator erweitert und es in registrieren. Jetzt in Jboss AS 7 eingeführt Ventil Konzept, wo Sie CustomAuthenticator in jboss-web.xml itself registrieren können. wie

Etwas ..

public class CustomFormAuthenticator extends FormAuthenticator { 
    @override 
    public boolean authenticate(Request request, Response response, LoginConfig config) throws IOException { 
     boolean authenticate = super.authenticate(request, response, config); 
     //here you might need to keep track whether your custom/static code executed once or not, 
     //just to avoid executing the same code again and again. 
     if(authenticate) { 
      int i = CustomSingleton.getInstnce().getExecuteCount(); 
      if(i <= 0) { 
       //invoke custom code. 
       //increment the count 
       CustomSingleton.getInstnce().incrementExecuteCount(); 
      } 
     } 
    } 
} 

Nun müssen diese in /server/default/deployers/jbossweb.deployer/META-INF/war-deployers-jboss-beans.xml In folgenden entry-authenticators Abschnitt mit server registrieren.

<entry> 
    <key>CUSTOM-FORM</key> 
    <value>full.qaulified.CustomFormAuthenticator</value> 
</entry> 

Dann in web.xml haben CUSTOM-FORM als auth-method

<login-config> 
    <auth-method>CUSTOM-FORM</auth-method> 
      <form-login-config> 
       <form-login-page>/login.html</form-login-page> 
       <form-error-page>/login-error.html</form-error-page> 
      </form-login-config> 
<login-config> 

this helps ..

+0

Ich habe versucht, ein etwas anderes Problem (Sitzungsfixierung) mit JBoss 6.1 zu beheben, und das war genau das, was ich brauchte. Super, danke! –

Verwandte Themen