Wie bekommt man in JBoss 8 in einem EJB den Principal?

Antwort vom

**In JBoss EAP 8 holst du den aktuellen EJB-Caller über `EJBContext` bzw. `SessionContext` mit `getCallerPrincipal()`; das ist der Standardweg.** Laut Jakarta EJB liefert diese Methode ein `java.security.Principal` für den aktuellen Aufrufer. ([jakarta.ee](https://jakarta.ee/specifications/platform/10/apidocs/jakarta/ejb/ejbcontext)) ```java import jakarta.annotation.Resource; import jakarta.ejb.Stateless; import jakarta.ejb.SessionContext; import java.security.Principal; @Stateless public class MyBean { @Resource private SessionContext ctx; public String currentUser() { Principal p = ctx.getCallerPrincipal(); return p.getName(); } } ``` ## Wichtig in JBoss 8 JBoss EAP 8 basiert auf Jakarta EE, deshalb ist das Paket jetzt `jakarta.ejb` statt `javax.ejb`. Wenn du alten Code aus EAP 7 oder WildFly migrierst, ist genau das oft der eigentliche Bruchpunkt. ([docs.redhat.com](https://docs.redhat.com/en/documentation/red_hat_jboss_enterprise_application_platform/8.0/pdf/migration_guide/Red_Hat_JBoss_Enterprise_Application_Platform-8.0-Migration_Guide-en-US.pdf)) Ein zweiter wichtiger Punkt: `getCallerPrincipal()` gibt dir den **Container-Principal**, nicht automatisch deine eigene Custom-Principal-Klasse. Genau das war in JBoss historisch oft ein Missverständnis. ([access.redhat.com](https://access.redhat.com/solutions/66867)) ## Wenn `anonymous` zurückkommt Dann ist das meist **kein EJB-Problem**, sondern ein Security-/Elytron-Mapping-Problem. Für EAP 8 dokumentiert Red Hat ausdrücklich Fälle, in denen `getCallerPrincipal().getName()` innerhalb des Beans `anonymous` liefert, obwohl der Remote-Client scheinbar erfolgreich authentifiziert wurde. Ursache ist typischerweise eine falsche Zuordnung der Elytron-Security-Domains. ([access.redhat.com](https://access.redhat.com/solutions/7141495)) Praktisch heißt das: Wenn dein EJB principal immer `anonymous` ist, suche zuerst in der EAP-8-Sicherheitskonfiguration und nicht im Bean-Code. ([access.redhat.com](https://access.redhat.com/solutions/7141495)) ## Klarer Unterschied Für EJBs nimmst du `SessionContext.getCallerPrincipal()`. Wenn du allgemeiner mit Jakarta Security arbeitest, gibt es zusätzlich `jakarta.security.enterprise.SecurityContext.getCallerPrincipal()`. Red Hat hebt für EAP 8 hervor, dass darüber inzwischen auch Custom-Principal-/Elytron-Szenarien besser unterstützt werden. ([docs.redhat.com](https://docs.redhat.com/en/documentation/red_hat_jboss_enterprise_application_platform/8.0/html/release_notes_for_red_hat_jboss_enterprise_application_platform_8.0/new_features_and_enhancements)) Kurz gesagt: Für ein EJB direkt im Bean ist `@Resource SessionContext` plus `getCallerPrincipal()` die richtige Lösung.

Kategorie: Technik Tags: Jboss Ejb Principal

Verwandte Fragen

Warum zeigt JBoss 8 bei SecurityAuthenticationFailedEvent in der Security Identity „Anonymous“, obwohl als Principal der richtige Benutzer steht?

Nein: Wenn in JBoss EAP 8 bzw. Elytron im SecurityAuthenticationFailedEvent die SecurityIdentity auf Anonymous steht, ist die Anmeldung aus Sicht des Security-Domains fehlgeschlagen oder noch nicht er...

Hat JBoss 8 im EJB Zugriff auf den HttpServletContext?

Nein: In einem EJB bekommst du HttpServletContext nicht direkt, weil ServletContext zur Servlet-Schicht gehört und EJBs bewusst vom HTTP-/Web-Layer getrennt sind. ServletContext ist Teil der Serv...