Grails 3.3.11 e Spring Security
22/11/2019 14:36
0
Prezados,

Estou com um problema na hora de recuperar o id do usuário por meio do Spring Security Meu código dispara um exceção nessa linha:

String iden = springSecurityService?.principal?.id


A grande questão é que funcionava no Grails 4.0.0. Nesta versão 4.0.0 eu usava no build.gradle na seção dependencies esta versão do Spring Security.

compile "org.grails.plugins:spring-security-core:4.0.0.RC2"
compile "org.grails.plugins:spring-security-rest:3.0.0.RC1"

Por razões de maturidade da versão eu fiz um downgrade para o Grails 3.3.11. O primeiro problema foi que a versão do Spring Security acima não funcionava mais. Entretanto, eu descobri a versão que funcionava para o 3.3.11 e substituí no build.gradle, em dependencies, conforme abaixo:

compile "org.grails.plugins:spring-security-rest:2.0.0.M2"
compile "com.google.guava:guava:19.0"
compile 'org.grails.plugins:spring-security-core:3.2.0'

Gostaria que alguém e desse uma luz me dizendo outra versão do Spring Security que funcione com o Grails 3.3.11 para eu poder pegar o id do usuário, ou me dizendo uma outra forma de pegar o id do usuário no Grails 3.3.11, com esta versão do Spring Security. O meu projeto é um profile=rest-api

Obrigado. 
Tags: Grails 3.3.11, Grails 4.0.0, Spring Security


0
Opa, qual o erro?


0
Kiko,
Desculpa, esqueci do óbvio, que era colocar a mensagem de erro. 
Apenas um destaque para o fato de que meu colega de trabalho está usando o mesmo token que eu e, no código dele ele consegui extrair o id do usuário. 
Mais uma vez obrigado.
Segue o erro abaixo.

No such property: id for class: org.springframework.security.core.userdetails.User. Stacktrace follows:
java.lang.reflect.InvocationTargetException: null
  at org.grails.core.DefaultGrailsControllerClass$ReflectionInvoker.invoke(DefaultGrailsControllerClass.java:211)
  at org.grails.core.DefaultGrailsControllerClass.invoke(DefaultGrailsControllerClass.java:188)
  at org.grails.web.mapping.mvc.UrlMappingsInfoHandlerAdapter.handle(UrlMappingsInfoHandlerAdapter.groovy:90)
  at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
  at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
  at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
  at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
  at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
  at grails.plugin.springsecurity.rest.RestLogoutFilter.doFilter(RestLogoutFilter.groovy:80)
  at org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55)
  at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317)
  at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127)
  at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91)
  at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
  at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114)
  at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
  at grails.plugin.springsecurity.web.filter.GrailsHttpPutFormContentFilter.doFilterInternal(GrailsHttpPutFormContentFilter.groovy:54)
  at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
  at grails.plugin.springsecurity.rest.RestTokenValidationFilter.processFilterChain(RestTokenValidationFilter.groovy:118)
  at grails.plugin.springsecurity.rest.RestTokenValidationFilter.doFilter(RestTokenValidationFilter.groovy:84)
  at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
  at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170)
  at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
  at grails.plugin.springsecurity.rest.RestAuthenticationFilter.doFilter(RestAuthenticationFilter.groovy:143)
  at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
  at grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter.doFilter(MutableLogoutFilter.groovy:64)
  at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
  at grails.plugin.springsecurity.web.SecurityRequestHolderFilter.doFilter(SecurityRequestHolderFilter.groovy:58)
  at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331)
  at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214)
  at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177)
  at org.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:77)
  at org.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:67)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
  at java.lang.Thread.run(Thread.java:748)
Caused by: groovy.lang.MissingPropertyException: No such property: id for class: org.springframework.security.core.userdetails.User
  at br.gov.cmb.cmbid.controllers.v1.IdController.getListOfDocumentsByOwnerAndByPart(IdController.groovy:141)
  ... 36 common frames omitted
25/11/2019 15:15


0
Como é o código que está buscando o atributo id de user?

Por que é os eguinte: o que vai estar na sessão do usuário, o que vai te retornar no springSecurityService.getCurrentUser() vai ser uma instância da sua classe de usuário.
Será que você não está colocando algum outro tipo de objeto lá, que não tenha este atributo?

Sugestão: coloca um println que exponha a classe do que está sendo retornado.


0
Kiko,

Deixa eu explica, eu não estou trabalhando com sessão, eu estou trabalhando com microsserviços.

Eu tenho um microsserviço que gera um token, a partir de um usuário e senha, sendo que, nesse token, eu tenho todas as roles que aquele token autoriza o usuário a fazer. Meus métodos do controller são anotados cada um com uma role específica. Estamos tentando desenvolver um projeto seguindo essa arquitetura.

Neste contexto, eu tenho um serviço gerador de Token, um serviço de disparo de notificações e um serviço de identificação digital. Esse é meu backend. No front, eu tenho um app mobile que consome o backend, sendo que pra gerar uma notificação eu tenho que ter o token e pra salvar uma id digital, eu também tenho que ter um token. 

O que ocorre é que os serviços de autenticação (token) e notificação estão em Grails 4. O serviço de id digital estava em Grails 4, mas eu fiz um downgrade pro Grails 3.3.11 por causa da maturidade dessa versão. O resultado disso foi: a linha String iden = springSecurityService?.principal?.id quando invocada no serviço de notificação (G4) pega o id do usuário normalmente baseado no token. O serviço de id digital (G3.3.11) da pau nessa mesma linha, não funciona. Chegamos a fazer um teste usando o mesmo token para ambos os serviços. No serviço do G4 funcionou. No serviço do G3.3.11 não funciona.

É mais ou menos isso. É tudo stateless. não tem sessão. A arquitetura é mais ou menos essa. Estou pensando em voltar o serviço do G3.3.11 para o G4, apenas para ratificar o funcionamento.

Valeu!

Obrigado! 
27/11/2019 10:26


0
Opa Alfredo,

mas não precisa de sessão mesmo não. A grande questão é: no momento em que é realizada a validação do token, vai ser definido um atributo de thread do tipo Authentication pelo Spring Security.
O segredo está aí: no que está sendo incluído neste objeto. Muito provavelmente o que está sendo definido não tem o atributo id, o que causa este problema que você está enfrentando.


0
Kiko,

O que você falou faz todo sentido e foi uma das primeiras coisas que eu pensei, só que o mesmo token funciona em uma versão do Grails e não funciona na outra. Vamos fazer o seguinte, vou deixar este tópico aberto aqui e quando eu conseguir resolver a questão eu posto a solução.

Muito obrigado pela gentileza e pela presteza.

Valeu!

Alfredo
28/11/2019 20:28



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