Como posso solicitar credenciais após a Primavera de Segurança ACL tem jogado um AccessDeniedException?

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

Pergunta

Eu estou usando Grails 2.2.3 e a Mola de Segurança ACL plugin 1.1.1, e eu gostaria de ter uma URL que é aberto ao público e a camada de serviço utilizando o @PostAuthorize anotação prende o recurso.Estamos a fazê-lo dessa forma, pois para determinar se um usuário tem acesso a um objeto em particular, precisamos olhar para o objeto primeiro.

O que eu gostaria de ser capaz de fazer é no controlador camada de pegar o AccessDeniedException, em seguida, fazer com que o navegador solicite credenciais e tente novamente.Eu tentei a visão ingênua de definição do status da resposta para o 401 e redirecionar de volta para si mesmo para tentar novamente.O problema que eu tive é que o navegador nunca solicitado para credenciais.

Para colocar isso em código que eu gostaria de fazer é a camada controller (controlador):

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

E a camada de serviço basta ter:

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

Obrigado por qualquer ajuda!

Foi útil?

Solução

Acabei de resolver o problema, e não é que eu estava faltando um cabeçalho que eu precisava para enviar juntamente com o código de status 401.

Para corrigir o que eu tenho acima do que você quer fazer é:

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

O "redirecionamento" eu estava procurando acontece automaticamente no navegador depois que as credenciais são submetidos.Eu estava enganado sobre precisando de algo específico para o redirecionamento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top