2016-07-31 32 views
0

Hintergrund: Ich habe eine Web-App, die AngularJS, Feder-Mvc und Federstütze für die Bereitstellung der Benutzeroberfläche verwendet. Ich habe eine Anforderung zum Lastenausgleich mit einem Elastic LB und es ist nicht mit Sticky-Sitzungen; Anfragen sind Round Robin. Ich habe Session-Replikation mit Spring-Session mit Gemfire für Session-Speicher implementiert. Das funktioniert gut.Problem speichern Sitzung beim Mischen Feder-Sicherheit-Gemfire und Feder-Sicherheit-oauth2

Ich muss mit einem OAuth2-Authentifizierungsserver (und eventuell mehreren OAuth2-Servern) rein für die Authentifizierung und die Weitergabe von userInfo integrieren. Ich habe versucht, die Frühlingswolke oauth2 @ EnableOAuth2Sso in der Web-App zu verwenden und einige Session-Serialisierungsprobleme zu lösen. Die bloße Hinzufügung des oauth2ClientContext zu der Sitzung schien beim Speichern der Sitzung zu Problemen mit ClassCastException zu führen.

Ich habe versucht, die folgenden Beispiele herunterzuziehen und sie funktionierten gut aus der Box, vor allem die Benutzeroberfläche und der Authserver.

Allerdings, als ich Spring Session in den Mix, Serialisierung zu einem Gemfire-Server hinzugefügt habe, stieß ich genau das gleiche Problem. Hier

ist der Stacktrace Highlight:

java.lang.ClassCastException: cannot assign instance of org.springframework.beans.factory.support.StaticListableBeanFactory to field org.springframework.aop.scope.DefaultScopedObject.beanFactory of type org.springframework.beans.factory.config.ConfigurableBeanFactory in instance of org.springframework.aop.scope.DefaultScopedObject

unten stacktrace abgekürzt:

ERROR o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception 

org.springframework.dao.DataAccessResourceFailureException: remote server on machine(gemfire:21800:loner):57660:9d1f3438:gemfire: : While performing a remote put; nested exception is com.gemstone.gemfire.cache.client.ServerOperationException: remote server on machine(gemfire:21800:loner):57660:9d1f3438:gemfire: : While performing a remote put 
    at org.springframework.data.gemfire.GemfireCacheUtils.convertGemfireAccessException(GemfireCacheUtils.java:238) ~[spring-data-gemfire-1.7.4.RELEASE.jar:1.7.4.RELEASE] 
    at org.springframework.data.gemfire.GemfireAccessor.convertGemFireAccessException(GemfireAccessor.java:91) ~[spring-data-gemfire-1.7.4.RELEASE.jar:1.7.4.RELEASE] 
    at org.springframework.data.gemfire.GemfireTemplate.put(GemfireTemplate.java:190) ~[spring-data-gemfire-1.7.4.RELEASE.jar:1.7.4.RELEASE] 
    at org.springframework.session.data.gemfire.GemFireOperationsSessionRepository.save(GemFireOperationsSessionRepository.java:147) ~[spring-session-1.2.1.RELEASE.jar:na] 
    at org.springframework.session.data.gemfire.GemFireOperationsSessionRepository.save(GemFireOperationsSessionRepository.java:35) ~[spring-session-1.2.1.RELEASE.jar:na] 
    at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.commitSession(SessionRepositoryFilter.java:244) ~[spring-session-1.2.1.RELEASE.jar:na] 
    at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.access$100(SessionRepositoryFilter.java:214) ~[spring-session-1.2.1.RELEASE.jar:na] 
    at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:167) ~[spring-session-1.2.1.RELEASE.jar:na] 
    at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80) ~[spring-session-1.2.1.RELEASE.jar:na] 
    ... tomcat filter chain and spring filter stuff 
Caused by: com.gemstone.gemfire.cache.client.ServerOperationException: remote server on machine(gemfire:21800:loner):57660:9d1f3438:gemfire: : While performing a remote put 
    ... gemfire internal stuff 
    at org.springframework.data.gemfire.GemfireTemplate.put(GemfireTemplate.java:187) ~[spring-data-gemfire-1.7.4.RELEASE.jar:1.7.4.RELEASE] 
    ... 31 common frames omitted 
Caused by: java.lang.ClassCastException: cannot assign instance of org.springframework.beans.factory.support.StaticListableBeanFactory to field org.springframework.aop.scope.DefaultScopedObject.beanFactory of type org.springframework.beans.factory.config.ConfigurableBeanFactory in instance of org.springframework.aop.scope.DefaultScopedObject 
    at java.io.ObjectStreamClass$FieldReflector.setObjFieldValues(ObjectStreamClass.java:2133) ~[na:1.7.0_80] 
    at java.io.ObjectStreamClass.setObjFieldValues(ObjectStreamClass.java:1305) ~[na:1.7.0_80] 
    ... java.io stuff 
    at org.springframework.aop.framework.AdvisedSupport.readObject(AdvisedSupport.java:557) ~[spring-aop-4.3.2.RELEASE.jar:4.3.2.RELEASE] 
    at sun.reflect.GeneratedMethodAccessor224.invoke(Unknown Source) ~[na:na] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_80] 
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.7.0_80] 
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1058) ~[na:1.7.0_80] 
    ... java.io stuff 
    at com.gemstone.gemfire.internal.InternalDataSerializer.basicReadObject(InternalDataSerializer.java:2966) ~[gemfire-8.1.0.jar:na] 
    at com.gemstone.gemfire.DataSerializer.readObject(DataSerializer.java:3210) ~[gemfire-8.1.0.jar:na] 
    at org.springframework.session.data.gemfire.AbstractGemFireOperationsSessionRepository$GemFireSessionAttributes.readObject(AbstractGemFireOperationsSessionRepository.java:800) ~[spring-session-1.2.1.RELEASE.jar:na] 
    at org.springframework.session.data.gemfire.AbstractGemFireOperationsSessionRepository$GemFireSessionAttributes.fromDelta(AbstractGemFireOperationsSessionRepository.java:834) ~[spring-session-1.2.1.RELEASE.jar:na] 
    at org.springframework.session.data.gemfire.AbstractGemFireOperationsSessionRepository$GemFireSession.fromDelta(AbstractGemFireOperationsSessionRepository.java:589) ~[spring-session-1.2.1.RELEASE.jar:na] 
    at com.gemstone.gemfire.internal.cache.EntryEventImpl.processDeltaBytes(EntryEventImpl.java:1345) ~[gemfire-8.1.0.jar:na] 
    ... gemfire internal stuff 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.7.0_80] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.7.0_80] 
    at com.gemstone.gemfire.internal.cache.tier.sockets.AcceptorImpl$1$1.run(AcceptorImpl.java:577) ~[gemfire-8.1.0.jar:na] 
    ... 1 common frames omitted 

Ich fand das folgende, https://jira.spring.io/browse/SPR-14117, die mich ermutigt, einige Gläser auf die neueste Aktualisierung Versionen, in der Hoffnung, die Feder-Boot-Versionen waren einfach hinter, aber es schien nicht zu helfen.

Version Info:

spring-cloud-starter-parent: Brixton.SR4 spring-cloud-security: 1.1.2.RELEASE spring-core: 4.3.2.RELEASE spring-security-oauth2: 2.0.10.RELEASE spring-session: 1.2.1.RELEASE

ich ein paar Optionen in Betracht gezogen haben: die OAuth2 Rahmen Neuverkabelung nicht mehr verwenden ScopedProxyMode.INTERFACES (scheint entmutigend), verwenden Redis vs. Gemfire, schreiben die gesamte Client von Grund auf neu (ich habe es vorher gemacht ... war nicht lustig).

FWIW habe ich hinzugefügt, die bereits die RequestContextFilter wie hier empfohlen: OAuth2ClientContext (spring-security-oauth2) not persisted in Redis when using spring-session and spring-cloud-security

Hat jemand eine Anleitung?

Antwort

0

Ich weiß nicht, ob dies direkt zu Ihrem Problem spricht, aber ich hatte/habe ein ähnliches Problem und ich denke, ich habe alle die gleichen Versionen wie Sie. Es scheint so, als ob es so viele Spring-Projekte gibt und alle versuchen miteinander Schritt zu halten, manchmal scheint es Kompatibilitätsprobleme zu geben. Ich fand die hier von Rob Winch beschriebenen Schritte behoben mein Problem - https://github.com/spring-projects/spring-session/issues/395

+0

Ja, ich habe den Teil für beide Boot-Anwendungen und Cloud-Anwendungen ausprobiert. Weder half. Letztendlich habe ich aufgrund von Zeitbeschränkungen auf Gemfire verzichtet und ging mit Redis weiter. Jetzt habe ich 99 Redis Probleme und Gemfire ist nicht eins. – qkerby

+0

Ich habe deine Antwort angenommen, weil ... naja ... du bist aufgetaucht, als niemand es getan hat, und weil du total zum Thema warst. – qkerby