Ich wäre sehr dankbar, wenn jemand mir bei den folgenden Fragen helfen könnte:
Was sind die Unterschiede zwischen @RolesAllowed- und @DeclareRoles-Annotationen?
Die Annotation @RolesAllowed
wird verwendet, um die Liste der Rollen anzugeben, die tatsächlich auf die Geschäftsmethode zugreifen dürfen. Das Verhalten des EJB zur Laufzeit wird durch das Vorhandensein dieser Anmerkung beeinflusst, da der EJB-Container aktiv prüft, ob der Aufrufer in einer zulässigen Rolle vorhanden ist. Diese Annotation kann auch für TYPE
s und METHOD
s definiert werden, sodass Sie die Liste der Rollen definieren können, die auf der Ebene einer Klasse oder einer Methode zulässig sind. Sie können die Liste der zulässigen Rollen für alle Methoden einer Klasse auf der Ebene einer einzelnen Methode überschreiben.
Die Annotation @DeclareRoles
hingegen dient lediglich dazu, eine Liste von Rollen zu deklarieren; Es entspricht dem Element security-role-ref
in der Datei ejb-jar.xml
. Der EJB-Container erfordert keine Kenntnis dieser Rollen, um Zugriffssteuerungsüberprüfungen für Geschäftsmethoden eines EJB durchzusetzen; stattdessen kann der Bean-Provider / Entwickler diese Rollen in isCallerInRole
tests verwenden, um die programmatische Sicherheit zu gewährleisten.
Die EJB 3.1-Spezifikation gibt Folgendes über die @DeclareRoles
-Anmerkung an:
17.2.5.3 Erklärung der Sicherheitsrollen, die von den Bean's referenziert werden Code
Der Bean-Provider ist verantwortlich für die Verwendung der DeclareRoles-Annotation oder die Sicherheits-Rollenreferenzelemente des Deployment-Deskriptors an deklarieren Sie alle Sicherheitsrollennamen, die im Enterprise-Bean-Code verwendet werden. Die Annotation DeclareRoles wird in einer Bean-Klasse angegeben, in der sie angegeben wird dient zum Deklarieren von Rollen, die durch den Aufruf von isCallerInRole getestet werden können aus den Methoden der annotierten Klasse. Die Sicherheit deklarieren Rollen erlaubt dem Bean Provider, Application Assembler oder Deployer Verknüpfen Sie diese im Code verwendeten Sicherheitsrollennamen mit den Sicherheitsrollen definiert für eine zusammengesetzte Anwendung. In Ermangelung dieser Verknüpfung Schritt wird jeder Name der Sicherheitsrolle, wie er im Code verwendet wird, angenommen entsprechen einer Sicherheitsrolle mit dem gleichen Namen.
Der zweite Teil Ihrer Frage lautet:
Ich habe eine Login-Funktion entwickelt, um Benutzernamen und Passwort anhand von Informationen in der Datenbank zu überprüfen. Ich möchte jedoch fragen, wie ich einem authentifizierten Benutzer eine Rolle zuweisen kann, die er mit den obigen Anmerkungen verwenden kann.
In diesem Fall ist ein allgemeiner Punkt, den ich beachten sollte, dass mein bevorzugter Ansatz darin besteht, keine progammatische Sicherheit zu verwenden, es sei denn, Ihre Anwendungsfälle erfordern dies tatsächlich. In den meisten Fällen ist es vorzuziehen, sie zu verwenden, wenn die Anforderungen mit deklarativer Sicherheit erfüllt werden können. Für die progammatische Sicherheit müssen Sie die Aufrufe von isCallerInRole
-Methoden verfolgen, und das Fehlen eines solchen Aufrufs kann zu einer Sicherheitsverletzung führen. In beiden Fällen müssen Sie in Ihrem Container zuerst die Gruppen und Principals in der Datenbank als Rollen erkennen, die möglicherweise für Zugriffssteuerungsüberprüfungen verwendet werden.
Einfach ausgedrückt muss sich der EJB-Client (eine Java SE-Anwendung oder ein Servlet oder ein anderer EJB) zuerst bei den Sicherheitsmechanismen des Containers authentifizieren, um die Principal
des Aufrufers zu ermitteln. Der erfolgreiche Einsatz der deklarativen oder programmatischen Sicherheit beruht daher auf einem erfolgreichen Authentifizierungsprozess. In Ihrem Fall müssen Sie Ihren Container so konfigurieren, dass er die Gruppen und Benutzer in Ihrer Datenbank erkennt und diese in Principal
-Objekte übersetzt, mit denen die Zugriffssteuerung deklarativ oder programmatisch erzwungen werden kann. Die meisten Container unterstützen zu diesem Zweck einen oder mehrere Varianten von JAAS-Login-Modulen. Glassfish 3.1 zum Beispiel erlaubt dies mit einem JDBCRealm , während JBoss 6.0 unterstützt dies mit einem DatabaseServerLoginModule . Sie müssen daher feststellen, ob Ihr Container ein solches Login-Modul unterstützt, und es so konfigurieren, dass es Ihre Datenbank verwendet.
Beachten Sie, dass die von den Containern bereitgestellten Login-Module in einigen Fällen möglicherweise nicht ausreichen, um Ihre Anforderungen zu erfüllen. In diesem Fall müssen Sie Ihr eigenes Login-Modul (und ggf. gegen die Schnittstellen des Containers) schreiben.
Darüber hinaus müssen Sie auch die Rollen, die von der Anwendung verwendet werden, den Benutzern und Gruppen im JAAS-Bereich zuordnen. Zum Beispiel, wenn Ihre Datenbank vom JAAS-Realm verwendet wird:
U1
, U2
, U3
, U4
und U5
und G1
, G2
und G3
, die U1
, U2
, U3
bzw. R1
, R2
und R3
(definiert durch die @RolesAllowed
-Anmerkung) den Zugriff auf ihre Methoden Dann müssen Sie die Rollen den Principals (Benutzern und Gruppen) im JAAS-Bereich zuordnen.Die Zuordnung muss selbst dann erfolgen, wenn die Rollennamen mit denen der Hauptnamen identisch sind. Glassfish vereinfacht dies, indem es den Standardprinzipal für die Rollenzuordnung unterstützt ordnet ähnliche Prinzipale (Benutzer oder Gruppen) Rollen direkt zu. Außerdem ist der Mapping-Prozess containerspezifisch. Wie Sie sich denken können, wird diese Zuordnung in containerspezifischen Implementierungsdeskriptoren und nicht im EJB-Implementierungsdeskriptor ( ejb-jar.xml
) durchgeführt.
Um die Antwort abzuschließen, müssen Sie jedem erstellten Benutzer eine Rolle zuweisen. Der Einfachheit halber können Sie eine einzelne Benutzergruppe erstellen, der alle Benutzer angehören können. Wenn sich der Benutzer bei einem JAAS-Bereich authentifiziert, enthält das Principal-Objekt diese Gruppe. Die Gruppe in Ihrem JAAS-Bereich kann dann einer EJB-Rolle zugeordnet werden, und der Rollenname kann in einer @RolesAllowed
-Anmerkung angegeben werden. Jeder Benutzer in der Datenbank, der nicht zu dieser Gruppe gehört, würde durch den EJB-Container daran gehindert, auf die annotierte (n) Methode (n) zuzugreifen.
Vielleicht ist meine Antwort möglicherweise nicht korrekt und kann unvollständig sein. Aber es kann in dieser Referenz gefunden werden Ссылка
DeclareRoles kann nur in der Klassenstufe verwendet werden Sie müssen @DeclareRoles aktualisieren, wenn Sie Rollen über isCallerInRole (roleName) referenzieren.
Grundidee
Standardmäßig sind alle Methoden einer Business-Schnittstelle zugänglich und protokolliert in oder nicht
Die Anmerkungen werden für die Bean-Klasse und nicht für die Geschäftsschnittstelle
Sicherheitsanmerkungen können auf die gesamte Klasse und / oder Person angewendet werden Methoden
Die Namen der verwendeten Sicherheitsrollen müssen über deklariert werden @DeclareRoles
@RolesAllowed Kann sowohl auf Klassen- als auch auf Methodenebene verwendet werden, um die Zugriffsebene einzuschränken.
ein Beispiel Klassen- und Methoden-Level-Einschränkungen mischen Sicherheitsanmerkungen können gleichzeitig auf Klassen- und Methodenebene verwendet werden. Diese Regeln werden nicht gestapelt, daher überschreibt das Markieren von "submitPatch" den Standardwert von "committer".
%Vor%BEARBEITEN:
Hier ist das Code-Snippet für SQLLoginModule . Sie können dieses Modul als Login-Modul verwenden. Auf diese Weise können Sie dem JAAS-Standard folgen.
Beim Commit wird dies aufgerufen, um Principals hinzuzufügen.
%Vor%Sie können auch hier nach weiteren Einzelheiten Ссылка suchen.
Es listet andere Optionen auf, die Sie auswählen können.