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?
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.
Tags und Links rest annotations spring-security