Comment puis-je demander des informations d'identification après que Spring Security ACL ait jeté une exception accessrée?

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

Question

J'utilise GRAVES 2.2.3 et le plugin ACL Security Spring Security 1.1.1, et j'aimerais avoir une URL ouverte au public et que la couche de service à l'aide de l'annotation @PostAuthorize sécurise la ressource.Nous le faisons de cette façon parce que de déterminer si un utilisateur a accès à un objet particulier, nous devons examiner l'objet en premier.

Ce que j'aimerais pouvoir faire, c'est dans la couche de contrôleur attrape l'accès à l'AccessDeniedException, puis demandez au navigateur de demander des informations d'identification et d'essayer à nouveau.J'ai essayé l'approche naïve de la définition du statut de réponse à 401 et de rediriger à nouveau pour réessayer.Le problème que j'ai rencontré est que le navigateur n'a jamais demandé des informations d'identification.

Pour mettre cela en code ce que je voudrais faire est dans la couche de contrôleur:

@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
   }
}

et la couche de service aurait simplement:

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

Merci pour une aide!

Était-ce utile?

La solution

J'ai fini par résoudre le problème, et il s'avère que je manquais un en-tête que je devais envoyer avec le code d'état 401.

Corriger ce que j'ai au-dessus de ce que vous voulez faire est:

@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 
   }
}

La "redirection" que je cherchais arrivait automatiquement dans le navigateur après soumission des informations d'identification.Je me suis trompé de quelque chose de spécifique pour la redirection.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top