Entwicklung mit programmgesteuerten APIs für EJB-Anwendungen
Dieser Artikel beschreibt, wie Sie Ihre EJB-Anwendungen (Enterprise JavaBeans) über das Programm sichern.
Informationen zu diesem Vorgang
- IsCallerInRole (String Rolle): Gibt true zurück, wenn dem Aufrufenden der Bean Zugang zur angegebenen Sicherheitsrolle gewährt wird. Wenn der Aufrufende keinen Zugang zur angegebenen Rolle hat oder kein Aufrufender authentifiziert wurde, wird false zurückgegeben. Sollte die angegebene Rolle die Zugriffsberechtigung Jeder besitzen, wird immer true zurückgegeben.
- getCallerPrincipal: Gibt das Principal-Objekt java.security zurück, das den Namen des Aufrufenden (der Bean) enthält. Wenn der Aufrufende nicht authentifiziert wurde, wird ein Principal mit einem nicht berechtigten Namen zurückgegeben.
Sie können ein Anmeldemodul so einrichten, das es die von diesen Aufrufen zurückgegebene Principal-Klasse anzeigt.
Wenn Sie die Methode isCallerInRole verwenden, deklarieren Sie ein Element security-role-ref im Implementierungsdeskriptor mit einem Unterelement role-name, das den an die Methode übergebenen Namen der Rolle enthält. Da tatsächliche Rollen beim Assemblieren der Anwendung erstellt werden, können Sie den Namen einer logischen Rolle verwenden und den Assemblierenden in der Beschreibung des Elements "security-role-ref" darauf hinweisen, dass diese Rolle über einen Link mit der tatsächlichen Rolle verbunden werden soll. Während der Assemblierung erstellt der Assemblierende ein untergeordnetes Element "role-link", um den Namen der Rolle mit der tatsächlichen Rolle zu verknüpfen. Ein Element "security-role-ref" kann erstellt werden, wenn ein Assembliertool wie Rational Application Developer verwendet wird. Sie können das Element "security-role-ref" auch beim Assemblieren mit einem Assembliertool erstellen.
Vorgehensweise
- Fügen Sie die erforderlichen Sicherheitsmethoden zum EJB-Modulcode hinzu.
- Erstellen Sie für alle in der Methode "isCallerInRole" verwendeten Namen von Rollen ein Element security-role-ref mit einem Feld "role-name". Wenn während der Entwicklung kein Element security-role-ref erstellt wird, vergewissern Sie sich, dass dieser Schritt bei der Assemblierung ausgeführt wird.
Ergebnisse
Beispiel
Die Sicherheitsrichtlinien mit den Funktionen des Java EE-Sicherheitsmodells zu deklarieren ist sinnvoll, wenn eine EJB-Anwendung auf externe Ressourcen zugreifen und den Zugriff auf die externen Ressourcen mit ihrer eigenen Berechtigungstabelle steuern möchte (Zuordnung externer Ressourcen zu Benutzern). Verwenden Sie in diesem Fall die Methode getCallerPrincipal, um die Identität des Aufrufenden abzufragen. Anschließend kann die Anwendung für die Berechtigung ihre eigene Berechtigungstabelle konsultieren. Die Identifizierung des Aufrufenden kann auch das Abfragen der entsprechenden Benutzerinformationen von einer externen Quelle, z. B. einer Datenbank oder einer anderen Enterprise-Bean, unterstützen. Die Methode isCallerInRole können Sie auf ähnliche Weise verwenden.
<security-role-ref>
<description>Provide hints to assembler for linking this role-name to
actual role here<\description>
<role-name>Mgr<\role-name>
</security-role-ref>
<security-role-ref>
<description>Hints provided by developer to map role-name to role-link</description>
<role-name>Mgr</role-name>
<role-link>Manager</role-link>
</security-role-ref>
public class aSessionBean implements SessionBean {
.....
// SessionContext erweitert EJBContext. Verwenden Sie für eine Entity-Bean EntityContext.
javax.ejb.SessionContext context;
// Die folgende Methode wird automatisch vom EJB-Container
// aufgerufen.
public void setSessionContext(javax.ejb.SessionContext ctx) {
context = ctx; // Kontext der Session-Bean speichern
}
....
private void aBusinessMethod() {
....
// Abfragen dessen, der die Bean aufgerufen hat, mit getCallerPrincipal()
java.security.Principal principal = context.getCallerPrincipal();
String callerId= principal.getName();
// Prüfen, ob der Aufrufende der Bean für die Rolle Mgr berechtigt ist
boolean isMgr = context.isCallerInRole("Mgr");
// Die obigen Informationen können von der Anwendung
// nach Bedarf genutzt werden
....
}
....
}
@javax.annotation.security.DeclareRoles("Mgr")
@Stateless // Annotationen werden zur Anzeige einer Session-Bean verwendet
public class aSessionBean implements MyBusinessInterface { // Die Schnittstelle sessionbean muss nicht erweitert werden
.....
// SessionContext erweitert EJBContext. Verwenden Sie in EJB 3.0 eine Annotation Resource für die Kontextinjektion
@Resource
javax.ejb.SessionContext context; }
....
private void aBusinessMethod() {
....
// Abfragen dessen, der die Bean aufgerufen hat, mit getCallerPrincipal()
java.security.Principal principal = context.getCallerPrincipal();
String callerId= principal.getName();
// Prüfen, ob der Aufrufende der Bean für die Rolle Mgr berechtigt ist
boolean isMgr = context.isCallerInRole("Mgr");
// Die obigen Informationen können von der Anwendung
// nach Bedarf genutzt werden
....
}
....
}