Spring Security 3.0 von Mike Wiesner, JAX 2010

Spring Security ist das Modul innerhalb des Java Frameworks Spring, das für die Authentifizierung, Autorisierung, und andere Zugriffsberechtigungen verantwortlich ist.

Die kürzlich veröffentlichte Spring 3.0 Version enthält auch einen neuen Release von Spring Security. Wer das Upgrade auf die Version 3.0 macht, muss jedoch einiges an Refactoring vornehmen, da es einige API-Changes gibt und die Packagestruktur geändert hat.

Viele Änderungen in dieser Version wurden anhand von JIIRA User Feedback vorgenommen. Folgendes sind die wichtigsten Neuerungen in Spring Security 3.0:

  • Spring Expression Language
  • Spring Security Extensions
  • Verbesserungen in der Authentifizierung

Spring Expression Language

Spring Security ist eines der ersten Frameworks, welches die Spring Expression Language benutzt. Expressions lassen sich in Method-Annotations sowie in der Web-Security einsetzen. Dies ermöglicht neue Möglichkeiten, verglichen mit dem bisherigen Voter-basierten Mechanismus. Nachfolgend illustriert ein kleines Beispiel, wie die EL in der Web-Security angewendet wird:

<http use-expressions=“true“>
<intercept-url pattern=“/secure/**“ access=“hasRole(‚ROLE_SUPERVISOR‘) and hasIpAddress(‚192.168.1.0/24‘)“ />
</http>

Die eingebaute hasRole(‚ROLE_SUPERVISOR‘) Expression ist nichts sehr spezielles und überprüft nur, ob der aktuell eingeloggte User die übergebene Permission, bzw. Rolle besitzt. Dementsprechend wird True oder False zurückgegeben. Neu ist aber die Expression, welche prüft, ob die IP-Adresse des Requests im angegebenen Range liegt. Dies ist je nach Netzwerk Setup eine sehr praktische Abfrage und illustriert wie mächtig die neue EL ist.

@Pre und @Post Annotations

Methoden Security ist meistens komplexer, als die Web-Security, da sie mehr Logik in der Prüfung enthalten kann. Dazu wurden neue Annotations eingeführt, in welchen die EL zum Einsatz kommt. Die Annotations werden vor oder nach dem Methodenaufruf angewandt. Um den Support einzuschalten muss folgendes definiert werden:

<global-method-security pre-post-annotations=“enabled“/>

Die Annotation @PreAuthorize prüft, ob eine Methode aufgerufen werden darf. In folgendem Beispiel ist dies der Fall, wenn der User die Permission PERMISSION_CREATE hat:

@PreAuthorize(„hasPermission(‚PERMISSION_CREATE‘)“)
public void createHolidayRequest(HolidayRequest hr);

Was bedeutet nun aber folgende Definition?

@PreAuthorize(„hasPermission(#hr, ‚admin‘)“)
public void deleteHolidayRequest(HolidayRequest hr, Permission permission);

Hier wird ein Methodenargument in der Expression Language benutzt, um zu entscheiden, ob der User die Permission besitzt. Die Entscheidung dieses Zugriffs, kann dann in einem ExpressionHandler geschrieben werden, welcher das PermissionEvaluator Interface implementiert.

Auf alle Methodenargumente kann man via Spring EL zugreifen, was sehr praktisch ist. So zum Beispiel wenn nur ein bestimmter User eine Methode aufrufen darf:

@PreAuthorize(„#hr.name == principal.name)“)
public void doSomething(HolidayRequest hr);

Filtering

Auch das Filtern von Collections und Arrays lässt sich nun mittels Expressions erledigen. Dies wird oftmals benutzt, um eine Liste beim Verlassen einer Methode zu filtern:

@PreAuthorize(„hasRole(‚ROLE_USER‘)“)
@PostFilter(„hasPermission(filterObject, ‚read‘) or hasPermission(filterObject, ‚admin‘)“)
public List getAll();

Beim Benutzen von @PostFilter Annotation, iteriert Spring Security durch die zurückgegebene Collection und entfernt alle Elemente, für welche die Expression false ist. Der Name filterObject referenziert das aktuelle Objekt in der Collection. Es ist auch möglich @PreFilter zu benutzen um den Filter-Mechanismus vor dem Methodenaufruf anzuwenden.

Spring Security Extensions

Spring Security Extension hat zum Ziel, die verschiedenen Module von Spring Security auszulagern. Damit sollen sich neue Authentifizierungsverfahren schneller implementieren lassen und die Releasezyklen kürzer werden.

Fazit

  • Spring Security 3 bietet bessere Performance und vor allem Erweiterbarkeit durch die neue Expression Language.
  • Spring Security Extensions schafft die Grundlage für neue Ideen.
Kommentare sind geschlossen.