wusste ich, dass es funktioniert, aber ich brauche auch so funktioniert es Roleprincipal
Leider nicht in Java EE, erhalten unter abgerufen werden. Der JAAS Subject ist nur ein "Sack von Principals", und welcher von diesen repräsentiert den Benutzer/Anrufer Principal und/oder die Rolle Principal (s) ist einfach nicht standardisiert. Jeder andere Container macht die Dinge hier anders. Die Javadoc for Tomcat's JAASRealm beschreibt diese und erklärt die Tomcat spezifische Konvention (Hervorhebung von mir):
Die JAAS-Spezifikation beschreibt das Ergebnis einer erfolgreichen Anmeldung als javax.security.auth.Subject Instanz, die null oder mehr enthalten java.security.Principal-Objekte im Rückgabewert der Subject.getPrincipals() -Methode. Allerdings sieht es keine Anleitung auf wie Principals zu unterscheiden, die die einzelnen Benutzer beschreiben (und sind daher angemessen, als der Wert des request.getUserPrincipal() in einer Web-Anwendung zurückzukehren) vom Auftraggeber (n) dass Beschreiben Sie die autorisierten Rollen für diesen Benutzer. Um so viel Unabhängigkeit wie möglich von der zugrunde liegenden LoginMethod Implementierung zu halten von JAAS ausgeführt wird, wird die folgende Politik dieses Realm umgesetzt: [...]
Abgesehen davon, von einem Java EE-Umgebung Sie selten sogar Zugriff auf den JAAS-Betreff, oft nicht einmal über herstellerspezifische Methoden. JAAS ist weit entfernt von dem universellen Standard, von dem Sie glauben, dass er es ist, besonders wenn es um Java EE geht.
Die einzigen Dinge, auf die Sie auf portable Weise zugreifen können, sind der Anrufer-Principal und die damit verbundenen Rollen, aber auch diese müssen nicht der genaue Anrufer sein, den Ihr JAAS Login-Modul erstellt hat.
JBoss AS zum Beispiel kopiert diesen Principal einige Male mit seinen eigenen Klassen. Wenn also Ihr JAAS-Modul einen kaz.zak.FooPrincipal
im Betreff für den Benutzer/Anrufer-Principal gespeichert hat, kann HttpServletRequest#getUserPrincipal()
einen org.jboss.security.SimplePrincipal
zurückgeben. Das einzige, was garantiert ist, ist, dass getName()
für diese Instanz die gleiche Zeichenfolge zurückgibt.
Für etwas mehr Hintergrund zu diesem Thema:
Die letzte Quelle sagt, im Grunde das Gleiche, in anderer Formulierung;
Obwohl es möglich ist, innerhalb von JAAS Tomcat als Authentifizierungs Mechanismus (JAASRealm) zu verwenden, die Flexibilität des JAAS Rahmen verloren geht Sobald der Benutzer authentifiziert ist. Dies liegt daran, dass die Principals verwendet werden, um die Konzepte von "Benutzer" und "Rolle" zu bezeichnen, und nicht mehr im Sicherheitskontext verfügbar sind, in dem die Webanwendung ausgeführt wird. Das Ergebnis der Authentifizierung ist nur über request.getRemoteUser() und request.isUserInRole() verfügbar.
Dadurch wird das JAAS-Framework für Autorisierungszwecke auf ein einfaches Benutzer-/Rollensystem reduziert, das die Verbindung mit der Java-Sicherheitsrichtlinie verliert.
Seien Sie sicher, dass Ihr Reich für Ihre Webapp verwendet wird, dann können Sie versuchen, Servlets API 'HttpServletRequest.getUserPrincipal()' –
ich das wusste und es funktioniert, aber ich brauche Thema abzurufen auch bekommen Roleprincipal – sasaman85