Como posso solicitar credenciais após a Primavera de Segurança ACL tem jogado um AccessDeniedException?
-
22-12-2019 - |
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!
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.