Solução: Problemas de autenticação Spring Security + Grails 3
28/09/2015 08:48
1
Bom não sei se alguém esta tendo o mesmo problema que o meu.. O problema é o seguinte quando eu tenho um controller Ex: IndexController com uma action home e esta action tenha a anotação @Secured com alguma role, se eu usar a url http://localhost:8080/index/index o spring security verifica que a action relacionada a esta url é protegia e necessita de login agora se eu mapear a action no UrlMappings.groovy como /minha-homepage(ou qualquer outra coisa aqui) por exemplo  não o spring security não funciona corretamente ele sempre deixa passar independente se o usuário esta logado ou não.
A solução que eu encontrei para o problema foi a seguinte:

Criar uma classe que extends a AnnotationFilterInvocationDefinition e sobrescrever o método isController
class CustomAnnotationFilterInvocationDefinition extends AnnotationFilterInvocationDefinition {
@Override
protected boolean isController(String controllerName, String actionName) {
return application.getArtefactByLogicalPropertyName(ControllerArtefactHandler.TYPE, controllerName)
}
}

e no arquivo grails-app/conf/spring/resources.groovy adicionar o seguinte código
objectDefinitionSource(CustomAnnotationFilterInvocationDefinition) {
application = ref("grailsApplication")
grailsUrlConverter = ref("grailsUrlConverter")
httpServletResponseExtension = ref("httpServletResponseExtension")
rejectIfNoRule = application.config.grails.plugin.springsecurity.rejectIfNoRule
}

Resumindo na implementação original o método isController usa o seguinte código 
application.getArtefactForFeature(ControllerArtefactHandler.TYPE, SLASH + controllerName + SLASH + actionName)
Que sempre retorna null e olhando na implementação do grails 3 o método getArtefactForFeature não tem mais implementação tem um simples return null 
Tags: spring security grails 3


0
Oi Weibe, é uma solução muito interessante.
Agora: já viu o uso de RequestMappings com o Spring Security? Ele te possibilita basicamente a mesma coisa, só que são entradas no banco de dados para as suas URLs customizadas.


0
Pois é o negócio e que eu estou fazendo teste para fazer a migração da versão 2 para 3 tentando manter as mesmas configurações... agora será que o request mappings no banco não tem o mesmo problema?
Já tem uma issue aberta no github com o mesmo problema.. ta parecendo que o plugin ta meio que largado.
28/09/2015 10:33


0
Oi Weibe,
na realidade há um esforço grande em cima deste plug-in agora.
Sobre o RequestMappings, ele é criado justamente para isto.
Recentemente apareceu um post no /dev/All. Dá uma lida: http://devall.com.br/blog/show/2606


0
Vou dar uma olhada nisso depois.. mais aproveitando o tópico você sabe como resolver o problema da exception AccessDeniedException lançada pelo spring boot security quando um usuário não logado tenta acessar um recurso protegido?
O problema que eu tenho é o seguinte queria mudar o comportamento padrão quando  ele lança a exception eu queria que redireciona-se para a tela de login e não exibir uma página com um erro 500 e o conteúdo da exception como ele faz por padrão. Em alguns posts pela internet a recomendação é fazer algo como:
?
?
http.exceptionHandling().accessDeniedPage("/403")

http.exceptionHandling().authenticationEntryPoint(...)
http.exceptionHandling().
accessDeniedHandle
(...)

Nenhuma da opções tive sucesso.
28/09/2015 11:36


0
Oi Weibe,
isto é uma chave de configuração do Spring Security. Por ele você define o handler para o caso de um acesso não autorizado ou mal sucedido definindo qual a página para a qual deve ser feito o redirecionametno.
Neste momento não estou com acesso à documentação do Spring Security, mas no site oficial do framework, busque por isto na documentação que você encontra rápidinho.


0
Eu resolvi o problema direcionando para o controller em vez de diretamente para a view.

Por ex:

class UrlMappings {
    static mappings = {
        "/$controller/$action?/$id?(.$format)?"{
            constraints {
                // apply constraints here
            }
        }
        "/index"(controller: 'homepage', action: 'index') // em vez de: "/index"(view:'/minha-homepage')
        "500"(view:'/error')
        "404"(view:'/notFound')
    }
}?

class HomepageController {
...
    @Secured('isAuthenticated()')
    def index() {
        respond new Object(params), view:'/minha-homepage'
    }
...
}


0
Esse problema acontecia bem no início quando o plugin estava sendo atualizado da versão grails 2 para grails 3, acho que esse problema foi resolvido.
28/07/2016 17:36



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto