2014-06-09 3 views
9

Wir haben vor kurzem begonnen, die @PreAuthorize Annotation mit unseren REST-Endpunkten zu verwenden. Es funktioniert gut, jedoch hatte ich eine Frage bezüglich des HTTP-Codes, der zurückgegeben wird, wenn ein GET im Gegensatz zu einem POST oder PUT ausgegeben wird. Es scheint, dass, wenn ein Benutzer nicht berechtigt ist, auf den REST-Endpunkt des Controllers zuzugreifen, der zurückgegebene HTTP-Status für GET und PUT/POST unterschiedlich ist.405 vs 403 zurückgegeben von Spring Controllers bei Verwendung von @ PreAuthorize

So, zum Beispiel, wenn ich einen Endpunkt habe, der ein GET ist und eine @PreAuthorize Annotation hat und der Benutzer keinen Zugriff hat, wird eine 403 Forbidden zurückgegeben. Das ist, was ich erwarte. Wenn die gleiche Annotation dann auf eine Controller-Methode gesetzt wird, die ein POST oder ein PUT ist, lautet die HTTP-Antwort 405 Method Not Allowed (beachten Sie, dass die POST/PUT-Methode bei richtiger Autorisierung wie erwartet 200 zurückgibt).

Beim Durchlaufen des Codes können Sie sehen, dass der zugrunde liegende Sicherheitsfilter eine 403 zurückgibt, aber im POST/PUT-Szenario wird der Statuscode gelöscht/ignoriert und durch eine 405 ersetzt, ähnlich wie bei einer NullPointerExcpetion Ihr Controller-Code.

Ist dies das erwartete Verhalten oder sollte eine 403 Forbidden immer für Benutzer zurückgegeben werden, die keinen Zugriff auf einen Endpunkt haben?

+1

Ich habe das gleiche Problem – pinkpanther

+1

Sieht für mich, dass die 405 wird durch die [Web-Sicherheitsschicht geworfen] (http://docs.spring.io/spring-security/site/docs/ 3.0.x/reference/el-access.html # el-access-web) anstelle der Zugriffssteuerungsschicht durch die @ PreAuthorize-Annotationen. Versuchen Sie, die Debug-Ebene für das Paket org.springframework.security zu aktivieren, um zu sehen, was wirklich dort passiert – danielgpm

+0

ich denke, Ihre Anfrage Methodentyp ist nicht korrekt –

Antwort

0

Es ist möglich, dass irgendwo dazwischen die Anforderung intern umgeleitet wird und auf einem Endpunkt endet, der einen anderen HTTP-Anforderungstyp erwartet und daher erhalten Sie ein HTTP 405. Ich habe gesehen, dass dies am häufigsten vorkommt Grund im Falle von Authentifizierungen

Verwandte Themen