Wie kann ich nach Anmeldeinformationen fragen, nachdem Spring Security ACL eine AccessDeniedException ausgelöst hat?

StackOverflow https://stackoverflow.com//questions/21051844

Frage

Ich verwende Grails 2.2.3 und das Spring Security ACL-Plugin 1.1.1 und hätte gerne eine URL, die für die Öffentlichkeit und die Serviceschicht, die das verwendet, offen ist @PostAuthorize Annotation sichert die Ressource.Wir machen es auf diese Weise, denn um festzustellen, ob ein Benutzer Zugriff auf ein bestimmtes Objekt hat, müssen wir uns zuerst das Objekt ansehen.

Ich möchte in der Controller-Ebene die AccessDeniedException abfangen, den Browser dann nach Anmeldeinformationen fragen lassen und es erneut versuchen.Ich habe den naiven Ansatz ausprobiert, den Antwortstatus auf 401 zu setzen und zu sich selbst umzuleiten, um es erneut zu versuchen.Das Problem, auf das ich gestoßen bin, ist, dass der Browser nie nach Anmeldeinformationen gefragt hat.

Um dies in den Code zu integrieren, möchte ich dies in der Controller-Ebene tun:

@Secured(['IS_AUTHENTICATED_ANONYMOUSLY'])
def controllerAction() {
   try {
      someService.action()
   } catch (AccessDeniedException ade) {
      // if logged in show FORBIDDEN, if not ask for credentials and try again
   }
}

Und die Serviceschicht hätte einfach:

@PostAuthorize("""returnObject.availability == 'ALL'""")
def action() {
   PersistedObject.findById(1)
}

Vielen Dank für jede Hilfe!

War es hilfreich?

Lösung

Am Ende habe ich das Problem gelöst und es stellte sich heraus, dass mir ein Header fehlte, den ich zusammen mit dem 401-Statuscode senden musste.

Um zu korrigieren, was ich oben habe, möchten Sie Folgendes tun:

@Secured(['IS_AUTHENTICATED_ANONYMOUSLY'])
def controllerAction() {
   try {
      someService.action()
   } catch (AccessDeniedException ade) {
      if (!springSecurityService.isLoggedIn()) {
         response.setHeader 'WWW-Authenticate', 'Basic realm="Grails Realm"' // the missing line
         response.sendError HttpServletResponse.SC_UNAUTHORIZED 
   }
}

Die von mir gesuchte „Weiterleitung“ erfolgt automatisch im Browser, nachdem die Anmeldeinformationen übermittelt wurden.Ich habe mich geirrt, dass ich für die Weiterleitung etwas Bestimmtes brauchte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top