JAX-RS-Ressourcen mit Annotationen sichern
Sie können JAX-RS-Ressourcen (Java™ API for RESTful Web Services) mithilfe von Annotationen sichern, die Sicherheitseinstellungen enthalten.
Vorbereitende Schritte
In dieser Task wird davon ausgegangen, dass Sie die Anwendung entwickelt und die JAX-RS-Ressourcen identifiziert haben, die Sie mithilfe von Annotationen sichern möchten.
Informationen zu diesem Vorgang
- @PermitAll - Gibt an, dass alle Sicherheitsrollen berechtigt sind, auf Ihre JAX-RS-Ressourcen zuzugreifen.
- @DenyAll - Gibt an, dass keine Sicherheitsrollen berechtigt sind, auf Ihre JAX-RS-Ressourcen zuzugreifen.
- @RolesAllowed - Gibt die Sicherheitsrollen an, die berechtigt sind, auf Ihre JAX-RS-Ressourcen zuzugreifen.
Sie können Ihre Ressourcen auf Klassenebene oder auf Methodenebene annotieren. Die folgenden Regeln steuern die Annotationen für die Sicherheit:
- Annotationen auf Methodenebene haben Vorrang vor Annotationen auf Klassenebene
- Im folgenden Code-Snippet ist die JAX-RS-Ressource, die von den Annotationen @GET und @Path von /addresses referenziert wird und der Methode getList() entspricht, nicht eingeschränkt und steht für öffentliche Nutzung bereit. Die Ressource, die mit den Annotationen @PUT und @Path von /addresses referenziert wird und der Methode updateList() entspricht, erfordert jedoch die Rolle Manager. Beispiel:
@Path(value="/addresses") @PermitAll public class AddressBookResource { @GET @Produces(value="text/plain") public String getList() { } @PUT @RolesAllowed(“Manager”) to public void updateList(String[] books) { } }
- Die Annotationen für die Sicherheit schließen sich gegenseitig aus.
- Das bedeutet, dass jede Ressource mit nur einer einzigen Annotation für die Sicherheit gesteuert wird.
Das folgende Beispiel ist beispielsweise nicht gültig, weil
@PermitAll und @RolesAllowed angegeben sind:
@Path(value="/addresses") @PermitAll @RolesAllowed(“Employee”) public class AddressBookResource { @GET @Produces(value="text/plain") public String getList() { } }
Im vorherigen Codebeispiel hat die Annotation "@RolesAllowed" Vorrang, und die Annotation "@PermitAll" wird ignoriert. Wenn Sie die Annotation "@RolesAllowed" und die Annotation "@DenyAll" angeben, hat die Annotation "@DenyAll" Vorrang.
Wenn Sie die Annotationen "@PermitAll" und "@DenyAll" auf Methoden- oder auf Klassenebene angeben, hat die Annotation "@DenyAll" Vorrang, da sie die Sicherheit durch Einhaltung des Standardprinzips gewährleistet.
Wenn Die Annotationen "@PermitAll", "@DenyAll" und "@RolesAllowed" alle auf Methoden- oder Klassenebene definiert werden, hat die Annotation "@DenyAll" Vorrang vor den Annotationen "@RolesAllowed" und "@PermitAll". Die Vorrangregelung für diese Optionen ist wie folgt:- @DenyAll
- @RolesAllowed
- @PermitAll
- Vererbungsregel
- JSR-250-Annotationen, die auf Klassenebene hinzugefügt werden, wirken sich nur auf die Klassen, die sie annotieren, und auf die entsprechenden Unterressourcenmethoden aus. Auf Klassenebene angegebene Annotationen haben keine Auswirkung auf Ressourcen, die von einer Superklasse übernommen werden.
- Regel für das Überschreiben von Methoden
- Annotationen in Ressourcen, die überschriebenen Methoden in Unterklassen entsprechen, haben Vorrang vor Annotationen,
die in der übergeordneten Klasse enthalten sind.
Im folgenden Snippet wird die Rolle LocalAdministrator verwendet, um auf die Unterressourcenmethode
/addresses/local zuzugreifen:
s@Path(value="/addresses") @PermitAll public class AddressBookResource { @GET @Produces(value="text/plain") public String getList() { } @PUT @RolesAllowed(“Administrator”) public void updateList(String books) { } } @Path(value="/addresses") @PermitAll public class LocalAddressBookResource extends AddressBookResource { @PUT @RolesAllowed(“LocalAdministrator”) @Path(value=”local”) public void updateList(String books){ } }
- Hinweise zu @RolesAllowed
- Es ist nicht zulässig, mehrere @RolesAllowed-Annotationen in einer Ressource gleichzeitig zu verwenden.
Sie könnnen
beispielsweise mit dem folgenden Code-Snippet erreichen:@RolesAllowed("role1") @RolesAllowed("role2") public String foo() { }
@RolesAllowed({"role1", "role2"}) public String foo() { }
- Hinweise zur Verwendung von Annotationen für die Sicherheit und zur Konfiguration von Integritätsbedingungen für die Sicherheit
Annotationen für die Sicherheit folgen dem deklarativen Sicherheitsmodell. Integritätsbedingungen für die Sicherheit, die im Implementierungsdeskriptor, der Datei "web.xml", konfiguriert sind, haben Vorrang vor Integritätsbedingungen für die Sicherheit, die über das Programm in der Anwendung annotiert sind. Es ist wichtig, dass Entwickler von JAX-RS-Ressourcen eine Balance zwischen konfigurierbaren Integritätsbedingungen für die Sicherheit und annotierten Integritätsbedingungen für die Sicherheit finden. Annotierte Integritätsbedingungen werden zusätzlich zu konfigurierten Integritätsbedingungen für die Sicherheit verwendet. Die JAX-RS-Laufzeitumgebung sucht nach annotierten Integritätsbedingungen, nachdem die Laufzeitumgebung des Web-Containers nach konfigurierten Integritätsbedingungen für die Sicherheit in der Datei "web.xml" gesucht hat.
Konfigurieren Sie die Integritätsbedingungen für die Authentifizierung in der Datei "web.xml". In der folgenden Beispieldatei "web.xml" ist die Integritätsbedingung SecurityConstraint_1 für die Sicherheit definiert. Diese Integritätsbedingung wird verwendet, um eine Authentifizierung bei der Anwendung anzufordern. Außerdem definiert die Integritätsbedingung SecurityConstraint_1 für die Sicherheit Vorgaben für URL-Muster, die den JAX-RS-Ressourcen entsprechen. Wenn eine JAX-RS-Ressource aufgerufen wird, die einer dieser Integritätsbedingungen entspricht, werden Berechtigungsprüfungen durchgeführt. Zugriffsprüfungen werden für die deklarativen Sicherheitsannotationen erst durchgeführt, nachdem die konfigurierten Integritätsbedingungen geprüft wurden.<web-app id="WebApp_someID"> <servlet> <servlet-name>AddressBookAppSample</servlet-name> <servlet-class> org.apache.wink.server.internal.servlet.RestServlet </servlet-class> <init-param> <param-name>javax.ws.rs.Application</param-name> <param-value>jaxrs.sample.AddressBookApplication </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>AddressBookApp</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <security-constraint id="SecurityConstraint_1"> <web-resource-collection id="WebResourceCollection_1"> <web-resource-name>AddressBookAppSample</web-resource-name> <description>Protection area for Rest Servlet</description> <url-pattern>/*</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> <http-method>PUT</http-method> </web-resource-collection> <auth-constraint id="AuthConstraint_1"> <description>Role1 for this rest servlet</description> <role-name>Role</role-name> </auth-constraint> <user-data-constraint id="UserDataConstraint_1"> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint> <security-role id="SecurityRole_1"> <description>This Role is used to drive authentication </description> <role-name>Role1</role-name> </security-role> <login-config> <auth-method>BASIC</auth-method> <realm-name>test realm</realm-name> </login-config> </login-config> </web-app>
In der vorherigen Beispieldatei "web.xml" wird Role1 für die gesamte Anwendung verwendet. Wenn Sie nur deklarative Sicherheitsannotationen definieren und keine Integritätsbedingungen für die Berechtigung aus der Datei "web.xml" verwenden, können Sie diese Rolle in der Anwendung dem Sondersubjekt "AllAuthenticated" für die Benutzerauthentifizierung zuordnen.
Vorgehensweise
- Stellen Sie fest, ob Integritätsbedingungen für die Sicherheit in der Datei "web.xml" für Ihre JAX-RS-Anwendung definiert sind.
- Konfiguriere Sie die Datei "web.xml", und fügen Sie Integritätsbedingungen für die Sicherheit hinzu. Integritätsbedingungen für die Sicherheit, die im Implementierungsdeskriptor, der Datei "web.xml", konfiguriert sind, haben Vorrang vor Integritätsbedingungen für die Sicherheit, die über das Programm in der Anwendung annotiert sind.
- Bestimmen Sie, ob zusätzlich zu den Integritätsbedingungen in der Datei "web.xml" Annotationen für die Sicherheit hinzugefügt werden sollen. Legen Sie fest, ob die Annotation @PermitAll, @DenyAll oder @RolesAllowed hinzugefügt werden soll, um zusätzliche Sicherheit für Ihre JAX-RS-Ressourcen zu erreichen. Berücksichtigen Sie die Regeln für das Hinzufügen von Annotationen für die Sicherheit, wie z. B. die zuvor beschriebenen Regeln für Vorrangstellung und Vererbung.
Ergebnisse
Sie haben sichere JAX-RS-Ressourcen mithilfe deklarativer Sicherheitsannotationen definiert.
Beispiel
@Path(value="/addresses")
@PermitAll
public class AddressBookResource {
@GET
@Produces(value="text/plain")
public String getList() {
}
@RolesAllowed(“Administrator”)
@PUT
public void updateList(String books) {
}
}