2016-05-12 11 views
0

Wir verwenden Spring Security @PreAuthorize Annotation, um die richtigen Rollen und Berechtigungen von Jersey-basierten REST-APIs zu überprüfen. Worüber wir uns Sorgen machen ist, dass wir die Annotation von einer Methode vergessen und sie ungesichert lassen.Wie kann sichergestellt werden, dass @PreAuthorize definiert wurde?

Gibt es eine Möglichkeit, sicherzustellen, dass alle APIs die Annotation haben, auch wenn es nur @PreAuthorize("permitAll") ist (d. H. Explizit alles erlaubt)?

Wir stellen uns vor, dass, wenn eine API die Annotation nicht verwendet, entweder die Anfrage blockiert ist (so dass die API nicht verwendet werden kann), ein Fehler protokolliert wird (so dass wir den Fehler schnell bemerken).

Eine Möglichkeit wäre, einen benutzerdefinierten Ausdruck zu erstellen, der ein Anforderungsattribut hinzufügt, das die Anforderung als "gesichert" markiert. Dann kann ein Webfilter überprüfen, ob das Anforderungsattribut vorhanden ist, und einen Fehler protokollieren, wenn dies nicht der Fall ist.

Gibt es einen saubereren Weg, dies zu tun? Beispiel: Legen Sie "denyAll" als Standardrichtlinie für nicht mit Annotationen versehene Methoden fest, und müssen Sie sie entsprechend überschreiben?

Antwort

0

ich beschlossen, endlich diese durch eine Jersey ResourceFilterFactory Zugabe, der überprüft, dass jede Methode oder Klasse die Anmerkung hat:

public class RestFilterFactory implements ResourceFilterFactory { 
    private static final Logger log = LoggerFactory.getLogger(RestFilterFactory.class); 

    @Override 
    public List<ResourceFilter> create(AbstractMethod method) { 
     ensurePreAuthorizedAnnotation(method); 
     return Arrays.emptyList(); 
    } 

    private void ensurePreAuthorizedAnnotation(AbstractMethod method) { 
     boolean found = false; 
     if (hasPreAuthenticatedAnnotation(method)) { 
      found = true; 
     } 
     if (hasPreAuthenticatedAnnotation(method.getResource().getResourceClass())) { 
      found = true; 
     } 
     if (!found) { 
      log.error("Resource is not protected with @PreAuthorize annotation: " + method); 
     } 
    } 

    private boolean hasPreAuthenticatedAnnotation(AnnotatedElement element) { 
     Annotation a = element.getAnnotation(PreAuthorize.class); 
     return a != null; 
    } 
} 
Verwandte Themen