JPA Security

Mit JPA Security gibt es eine relativ neue Access Control Lösung für objektrelationale Datenbankzugriffe über die Java Persistence API. Der große Vorteil gegenüber anderen Sicherheitslösungen ist, daß die Zugriffskontrolle und das Ausfiltern in der Datenbank stattfindet. Nicht erlaubte Daten werden also gar nicht erst geladen, wie es beispielsweise Spring Security machen muß, um die Objekte auf Zugriffsbeschränkungen zu untersuchen und gegebenenfalls bereits geladene Daten zu verwerfen.

JPA Security ist ein rein deklarativer Ansatz und kann per Annotationen oder auch XML konfiguriert werden. Sicherheitsrelavanter Code kann dadurch aus der Geschäftslogik eliminiert werden. Das spart vor allem Code-Duplikationen und erleichtert die Les- und Wartbarkeit. Es wird aber nicht versucht, bestehende Security Lösungen zu ersetzen. Vielmehr kann sich JPA Security auch innerhalb von Spring Security oder die Sicherheitsmechanismen der Java EE Plattform integrieren.

An der aktuellen Versionsnummer 0.4.0 erkennt man noch den frühen Stadium des Projekts, welches unter Apache License 2.0 veröffentlicht ist. Auf der Projekt-Homepage findet sich die Dokumentation und mehrere gut nachvollziehbare Tutorials.

Aktiviert wird JPA Security in der persistence.xml:

<persistence-unit name="pu" transaction-type="RESOURCE_LOCAL">
  <provider>net.sf.jpasecurity.persistence.SecurePersistenceProvider</provider>
  <properties>
    <property name="net.sf.jpasecurity.persistence.provider" value="org.hibernate.ejb.HibernatePersistence" />
    <property name="net.sf.jpasecurity.security.authentication.provider" value="net.sf.jpasecurity.security.authentication.StaticAuthenticationProvider"/>
    ...

Mit @Entity markierte Domain-Klassen können dann um zusätzliche Annotationen erweitert werden, um die Zugriffe einzuschränken:

@DeclareRoles({"admin", "user"})
@RolesAllowed("admin")
@Permit(rule = "name = CURRENT_PRINCIPAL")
@Entity
public class  User ...

@DeclareRoles definiert die möglichen Rollen (mindestens an einer Entität), @RolesAllowed erlaubt Benutzern mit der angegebenen Rolle, diese Entität zu speichern, zu lesen und zu löschen. Mit @Permit können weitere Regeln definiert werden. In diesem Fall ist der Zugriff erlaubt, wenn der angemeldete Benutzer auf sein eigenes User-Objekt zugreift.

In einer JPA Standalone Anwendung bietet die Klasse StaticAuthenticationProvider Methoden zur Authentifizierung eines Benutzers und mit runAs() die Möglichkeit, einzelne Codeblöcke mit besonderen Rechten innerhalb eines Callbacks auszuführen.

StaticAuthenticationProvider.authenticate("john.doe", "admin");
EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("pu");
...
StaticAuthenticationProvider.runAs("root", Arrays.asList("admin"), new PrivilegedAction() {
      public Object run() {
        EntityManager entityManager = ...
        ...
      }
});
Short URL for this post: http://wp.me/p4nxik-X3
This entry was posted in Java EE, Java Persistence, Security and tagged , , . Bookmark the permalink.

Leave a Reply