2016-08-05 62 views
0

z.B.Spring-Sicherheit RESTful-Pfad-basierte Rollensteuerung

/user/{userId}/* # Only user with userId and admin can access 
/order/{orderId}/* # Only the order owner of orderId and admin can access 

aktuelle Lösung, die @Current Annotation ist eine maßgeschneiderte Injektion, die an die token zum Server weitergeleitet beziehen ist. @PathVariable("user-id") UserEntity user wird von einem Weg mit Feder Daten bekam

@PreAuthorize("#user.id == #u?.id") 
public UserDTO access(@P("user") @Current UserEntity requestUser, 
         @P("u") @PathVariable("user-id") UserEntity user) 

@PreAuthorize("#user.id == #uid && (#order == null || #order?.user?.id == #uid)") 
public Message access(@Current @P("user") UserEntity user, 
         @PathVariable("user-id") @P("uid") Long uid, 
         @PathVariable("order-id") @P("order") OrderEntity order) 

Wir haben zu viele Anmerkung, gibt es eine einfache Möglichkeit, um sie alle zu Config?

Versuchte

  1. Verwenden .antMatchers("/user/[0-9]+/*").hasRole("ROLE_USER") können die Benutzerprüfung anpassen.
  2. AOP, zu kompliziert, kann nicht auf URL basieren.

Antwort

1

Ich empfehle Ihnen, Methodensicherheit zu verwenden, um feinkörnige Logik zu implementieren, um Ressourcenzugriff zu autorisieren. URL-basierte Authentifizierung ist meiner Meinung nach nur für einfache Anwendungsfälle wirksam.

Ich würde auch mit eigenen Anmerkungen AOP verwenden vorschlagen Ihre Methode zur Implementierung von Sicherheit (statt @PreAuthorize zu verwenden), wenn Ihre Berechtigungslogik mehr Zeilen Code erfordert ...

Zum Beispiel könnten Sie kommentierten Methodenaufrufe abfangen:

@Before("@annotation(your.annotations.AllowedToOwner) && @annotation(ann)") 
public void checkOwner(JoinPoint joinPoint, AllowedToOwner ann) throws Throwable { 

    // check owner, throws AccessDeniedException if check fails... 
} 
+0

Vielleicht ist dies nur machbar. – wener

+0

@wener dies ist der Ansatz, den ich normalerweise auf meine Projekte anwende. Vielleicht gibt es bessere Wege, um das zu erreichen, was Sie wollen, aber ich finde diese Methode sehr gut lesbar und effektiv. – davioooh