Hinzufügen von benutzerdefinierten context-Informationen zu EJB-Methode aufruft
Möchte ich weitergeben-Authentifizierung Informationen zu EJB stateless session beans, die beim aufrufen Ihrer Methoden aus einer Java-Webanwendung (Wicket). Die Informationen bestehen aus einer Benutzerkennung und eines Authentifizierungs-Typ (Sie erinnern sich Cookies oder user/Passwort) gespeichert ist, die in der http-session. Eine offensichtliche Lösung ist, fügen Sie diese als parameter an alle EJB-Methoden, aber dies ist mühsam und ich hoffe, dass eine andere Lösung existiert.
Den JNDI-lookup von EJB-beans erfolgt über javax.die Benennung.InitialContext#lookup(String) in der web-tier.
Gibt es eine portable Möglichkeit, um die Authentifizierungsinformationen an eine aufrufende Kontext, so es verfügbar ist, zu den Bohnen geben? Ich brauche diesen Prozess, um verfügbar zu sein für den Anrufer sowohl in der EJB-Schicht (für eine eventuelle web-service-Endpunkt) und in der web-Schicht.
Einige weitere Informationen
Ich bin mit Java EE 6. CDI ist nicht benutzt, und ich würde eher vermeiden, es umzusetzen.
Authentifizierung erfolgt, indem der web-Schicht mit stateless beans Validierung erinnern, cookies, und Benutzer/Passwort-Kombinationen. Wenn ein Besucher zuerst auf die site, die Authentifizierung mit der remember-cookie probiert. Wenn schließlich erforderlich, wird der Benutzer aufgefordert, die Anmeldung mit Benutzername und Passwort. Wie oben erwähnt, wird die Authentifizierung-status wird gespeichert, in der http-session. Ich glaube nicht, das die Java-EE-security-Modell basiert auf reichen, da ich nicht herausfinden konnte, wie diese Authentifizierung könnte, angemessen berücksichtigt werden.
Den Autorisierungs-Schema basiert auf dynamischen Rollen ähnlich wie Facebook bestimmt die Autorisierung basierend auf der Verbindung zwischen 2 Usern und einige Einstellungen. Einige Handlungen auch berücksichtigen, die Art der Authentifizierung. Zum Beispiel, änderung von account-Einstellungen erfordert, Benutzer/Passwort und das cookie ist noch nicht genug. Von dem, was ich verstanden habe, die Java-EE-standard-Gruppen und-Rollen sind nicht eine gute Passform für diese Anforderung.
Andere Verwandte Fragen, die ich gefunden
EJB3 & Wie JAAS-Subjekt/AUFTRAGGEBER weitergegeben EJB Tier vom servlet-container?
Die Kontrolle der Sicherheits-Grundsatz verabschiedet, die auf eine EJB-Aufruf
Die Bindung einer Benutzer-Entität und einem GlassFish AUFTRAGGEBER
Zugriff auf die wichtigsten Kunden innerhalb einer ejb-Methode
dynamische Rollen auf einem Java-EE-server
Ich hoffe meine Frage ist klar genug. Wenn mehr Informationen benötigt werden, werde ich mich gerne zur Verfügung stellen.
Bearbeiten
Feste links. Notiz hinzufügen über die CDI.
- adam-bien.com/roller/abien/entry/how_to_pass_context_with beschreibt einen Ansatz mit thread-lokalen Speicher für den Austausch von Kontextinformationen zwischen den Schichten. Ich bin jedoch besorgt, dass clustering und asynchrone Methodenaufrufe wird es problematisch mit solchen Ansatz.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Sie sollten Bedenken:
Erstellen eines interceptor für die Autorisierung. Es wird Ihnen einen gemeinsamen Ort für die Autorisierung trotz, aus welcher Schicht der Anruf gemacht wurde. Sie könnten prüfen, ob der Aufrufer darf die Methode aufrufen oder wenn die session noch aktiv ist (D. H. überprüfen Sie es in die DB).
In der interceptor-Sie passieren könnte, einige Nutzer-bezogene Daten mit
InvocationContext#getContextData().put("user-related-data-name", someObj)
. In der Anrufer-EJB-können Sie diese Daten mithilfeSessionContext#getContextData()
.Ein Beispiel der Weitergabe von kontextuellen Daten mit
SessionContext
finden hierDen letzten (und interessanteste Teil ist) würde, wie man die Anmeldeinformationen des Benutzers auf die EJB-Schicht. Wenn Sie sagen, dass über WebServices Endpunkt als ich denke, Sie müssen eine Art von Grenze-Klasse oder geben Sie ein Verfahren, die einige sessionId für jeden Anruf.
Wenn es um die Vermehrung
HttpSession
Daten vom Servlet zum EJB... Es könnte eine lange gedreht, aber ich würde denken mit der CDI. Ihre Servlet vielleicht@SessionScoped
bean enthält den Benutzer-Anmeldeinformationen, und Sie Spritzen den gleichen@SessionScoped
bean innerhalb der interceptor.Ich bin mir nicht sicher, ob es überhaupt möglich (Injektion von CDI beans in der Abfangjäger oder die gemeinsame Nutzung
@SessionScoped
zwischen Servlets und EJB ' s Schichten).removeTransaction(AuthenticationInfo authInfo, long personId, long transactionId)
. In diesem Fall wird die Genehmigung ist abhängig vonpersonId
aber der interceptor nicht zu erhalten, argument-Namen, sondern nur die argument-Typen. Daher ist Ihre einzige Möglichkeit, um festzustellen, ob argument #2 oder #3 ist das hinzufügen von meta-Daten irgendwo welche bekommen kann out-of-sync mit der Deklaration der Methode. Ist dies nicht der Fall, wenn die Autorisierung erfolgt ist, als ein Methodenaufruf in die Körper vonremoveTransaction
.