2012-08-01 19 views
5

Ich möchte Sicherheitsregeln basierend auf benutzerdefinierten URL-Parametern (Pfadvariablen) erstellen. In Beispiel. Nehmen wir an, ich möchte einen Benutzer haben, der Administratorzugriff für Ressourcen namens Brand1 und Brand2 hat, aber keinen Zugriff auf die Ressource Brand3 hat. Wir können Ressourcen mit folgenden Links bearbeiten.Spring Security mit Pfadvariablen

http://myapp/brand/edit/1 
http://myapp/brand/edit/2 
http://myapp/brand/edit/3 

jetzt in Sicherheitskontext würde Ich mag so etwas wie dieses

<security:intercept-url pattern="/brand/edit/{brandId}" 
      access="hasRole('ROLE_ADMIN') or 
        @authorizationService.hasBrandPermission(
        #brandId, principal.username)"/> 

Das einzige, was ich Benutzername ist zu tun bekommen. BrandId ist immer null. Ich habe das mit @PreAuthorize gemacht und es hat funktioniert, aber jetzt möchte ich die Sicherheitskonfiguration in einer einzelnen XML-Datei zentralisieren, anstatt sie auf alle Controller-Klassen zu verteilen. Wenn ich @PreAuthorize verwendete, hat mich mein access-densumed-handler nicht auf die verweigerte Seite weitergeleitet, sondern hat eine hässliche AccessDeniedException inead angezeigt.

Ich würde wirklich irgendwelche Ideen aprecieate.

+0

Ich bekomme das Problem nicht. Ist die BrandId immer Null? Oder ist es, dass es die Ressource nicht sichert? Oder ist es die hässliche AccessDeniedException-Seite? –

+0

BrandID ist Null –

Antwort

1

können Sie versuchen, regulären Ausdruck zu verwenden.

Sie das Attribut hinzufügen müssen Pfad-type = "regex" in Ihrem http Elemente oder Anfrage-Matcher = "regex" wenn Ihre Feder Sicherheit mit 3.1

die Dokumentation für weitere Details zu sehen

+0

Ich dachte, dass Regexp nur zum Definieren von URL-Mustern nicht für die Verweisung von Pfadvariablen ist. dh ich kann etwas wie "/pfad/zu/*.html" tun, so dass es alle URLs anwendet, die dem Muster entsprechen, aber was mich interessiert, ist "/ Pfad/zu/Ressource/{RessourceId}" und ressourceId Wert in bekommen ' access 'section also ie access = "@ myService.mySecurityMethod (#resourceId)" –

1

ändern der Spring Security Version in Ihrem pom.xml-4.1.0.RELEASE:

<spring-security.version>4.1.0.RELEASE</spring-security.version> 

<dependency> 
    <groupId>org.springframework.security</groupId> 
    <artifactId>spring-security-web</artifactId> 
    <version>${spring-security.version}</version> 
</dependency> 

Sie müssen möglicherweise reinigen Dein Maven-Projekt danach.

(Ich weiß, es ist eine alte Frage. Nichtsdestoweniger ich konfrontiert dasselbe Problem 3 Jahre später).

+0

Wie hängt das mit der Frage zusammen? – tunix