405 vs 403 wurde von Spring Controllers zurückgegeben, wenn @PreAuthorize verwendet wurde

9

Kürzlich haben wir begonnen, die Annotation @PreAuthorize 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.

Wenn zum Beispiel ein Endpunkt ein GET ist und eine @PreAuthorize Annotation hat und der Benutzer keinen Zugriff hat, wird 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, ist die HTTP-Antwort 405 Method Not Allowed (beachten Sie, dass die POST / PUT-Methode bei richtiger Autorisierung 200 wie erwartet 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 einem NullPointerExcpetion in Ihrem 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?

    
borq 09.06.2014, 13:19
quelle

1 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 bei Authentifizierungen der häufigste Grund ist.

    
Farooq Khan 19.06.2017 12:21
quelle