2016-05-31 13 views
0

Ich verwende Spring Security (Version 4.0.3.RELEASE) mit ACL-Level-Berechtigungen - Ich versuche, PreAuthorize ACL-Berechtigungen auf eine Löschmethode in meinem CrudRepository anzuwenden Schnittstelle mit der Annotation @PreAuthorize mit einem Aufruf der SPEL-Methode "hasPermission" (siehe unten). Die hasPermission verweist auf das Eingabeargument mit der Hash-Notation, die ich in mehreren Foren, Tutorials und Referenzdokumenten gesehen habe, aber das Eingabeargument (das Objekt, das ich löschen möchte) wird vom SPEL-Parser oder der Unterstützung nicht aufgenommen Rahmen. Also, mit anderen Worten, ich möchte das Objekt namens "apiKey" löschen, welches das Eingabeargument unten ist. Ich referenziere es in der SPEL-Annotation mit "#apiKey", aber wenn ich einen Breakpoint in die Methode org.springframework.security.acls.AclPermissionEvaluator.hasPermission (...) setze, ist das Eingabeargument "domainObject" NULL.Spring SPEL-Objektreferenz fehlgeschlagen "Dereferenzierung" Methode Eingabe Argument Objekt

Ich bin ziemlich neu in Spring und ACL, also muss ich etwas grundsätzlich falsch machen. Ich habe versucht, Breakpoints im Spring SPEL Parser zu setzen und während der Laufzeit durchzulaufen, aber ich kann den Teil des Codes nicht finden, der die reflektiven Argumente basierend auf dem SPEL-Token auflöst. Ich denke, es ist "versteckt" in einer nativen Methode oder etwas.

Ich habe auch versucht, mit der SPEL-Syntax zu fummeln. Nichts anderes scheint korrekt zu analysieren, deshalb denke ich, dass "#argument_name" die richtige Syntax ist - es ist nur so, dass SPEL das Argument deserferenziert.

Mein CrudRepository Code w/die Objektreferenz ("#apiKey"), das nicht funktioniert:

public interface ApiKeyRepository extends CrudRepository<ApiKey, Long> { 
    @Override 
    @PreAuthorize("hasPermission(#apiKey, 'DELETE')") 
    void delete(ApiKey apiKey); 
} 

Spring Security-Code, die sollte mein apikey Objekt werden empfangen, sondern stattdessen ein NULL wird immer Wert für die Domainobject:

public class AclPermissionEvaluator implements PermissionEvaluator { 
    ... 
    public boolean hasPermission(Authentication authentication, Object domainObject, Object permission) { 
     if (domainObject == null) { 
      return false; //<== This is where I'm getting access denied from 
     } 
     ... 

Irgendwelche Ideen, warum SPEL ist nicht richtig durch apikey Eingabeargument verweisen? Danke im Voraus.

Antwort

0

dachte ich, mein Problem dank THIS POST aus, die THIS DOC verwiesen:
Anscheinend nicht Objektverweise auf Methodenargumente in einer Schnittstelle, ohne die @param Anmerkung auf dem ARG machen kann. Also, hier ist mein aktualisierter Code, der das Problem behebt:

public interface ApiKeyRepository extends CrudRepository<ApiKey, Long> { 
    @Override 
    @PreAuthorize("hasPermission(#apiKey, 'DELETE')") 
    void delete(@Param("apiKey") ApiKey apiKey); 
}