2012-07-12 40 views
0

我在寫一個使用Spring安全插件的Grails應用程序。我打開了以下屬性爲春季安全插件會話固定 - 在會話中訪問值時發生錯誤

grails.plugins.springsecurity.useSessionFixationPrevention =真 grails.plugins.springsecurity.SessionFixationPrevention.migrate =真 grails.plugins.springsecurity.SessionFixationPrevention.alwaysCreateSession =真正

我在我的AuthenticationProvider下面的代碼

高清會議= 個RequestContextHolder.currentRequestAttributes()的getSession()

session.key =「一些價值」

現在的身份驗證後,我在我的RememberMeService類的loginSuccess方法的代碼被調用,當我試圖讓在會話中值被放置,我得到這個錯誤

Ĵ

ava.lang.IllegalStateException:的getAttribute:會話已經 INV在 org.apache.catalina.session.StandardSession.getAttribute(StandardSession.java:1014) 在 org.apache.catalina.session.StandardSessionFacade.getAttribute(StandardSessionFacade.java:110) alidated在 org.codehaus.groovy .grails.web.servlet.mvc.GrailsHttpSession.getAttribute(GrailsHttpSession.java:45) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法)在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597)at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite $ PojoCachedMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:229) 在 org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:52) 在 org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall( CallSiteArray.java:40) 在 org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:54) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java: 124) 在 org.codehaus.groovy.grails.plugins.web.ServletsGrailsPlugin $ _closure1_closure2.doCall(ServletsGrailsPlugin.groovy:44) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本機方法)在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在java.lang.reflect.Method.invoke(Method.java:597)在 org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:88) 在 org.codehaus.groovy.runtime.metaclass.ClosureMetaMethod.invoke(ClosureMetaMethod.java:80) 在 groovy.lang。 ExpandoMetaClass.getProperty(ExpandoMetaClass。的java:1109) 在 org.codehaus.groovy.runtime.InvokerHelper.getProperty(InvokerHelper.java:161) 在 org.codehaus.groovy.runtime.callsite.PojoMetaClassGetPropertySite.getProperty(PojoMetaClassGetPropertySite.java:33) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:235) 在 com.teslagovernment.security.TabulaeRememberMeServices.loginSuccess(TabulaeRememberMeServices.groovy:59) 在 org.springframework.security.web .authentication.AbstractAuthenticationProcessingFilter.successfulAuthentication(AbstractAuthenticationProcessingFilter.java:294) at org.springframework.secu rity.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218) 在 org.codehaus.groovy.grails.plugins.springsecurity.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:40) 在 org.springframework.security。 web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:378) 在 org.codehaus.groovy.grails.plugins.springsecurity.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:79) 在 org.springframework.security.web。 FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:378) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(Se curityContextPersistenceFilter.java:79) 在 org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:378) 在 org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:167) 在 org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 在 org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 在 org.apache.catalina .core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF ilterChain.java:206) 在 org.codehaus.groovy.grails.web.servlet.filter.GrailsReloadServletFilter.doFilterInternal(GrailsReloadServletFilter.java:104) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter。的java:76) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 有機.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:69) at org.springframework.web.filter.OncePerRequestFilter。的doFilter(OncePerRequestFilter.java:76) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.codehaus.groovy.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:65) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 在 有機.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain。的doFilter(ApplicationFilterChain.java:206) 在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) 在 org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 在 org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 在 org.apache.catalina .core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(Appli cationFilterChain.java:206) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 在 org.apache.catalina.core .StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) at org.apache.coy ote.http11.Http11Processor.process(Http11Processor.java:849) 在 org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:583) 在 org.apache.tomcat.util.net。 JIoEndpoint $ Worker.run(JIoEndpoint.java:454)

我的問題是,爲什麼會出現這種情況,我怎麼能在我的AuthenticationProvider 組數據,我可以在我的RememberMeService訪問?

感謝

回答

1

嘗試驗證後立即發出重定向和訪問任何複製的會話屬性之前。認證後,服務權限中的會話變量可能仍然是從請求上下文引用舊會話。重定向將刷新請求上下文。

否則,您可以在您的AuthenticationProvider中的spring安全主體對象中存儲任何其他屬性。在您的提供者之外,您可以通過applicationContext中的springSecurityService訪問委託人:

MyPrincipalObject obj = springSecurityService.principal 
def key = obj.key 
+0

如何在AuthenticationPRovider中獲得我的響應對象。我沒有看到任何東西,除非它們是默認注入的。 – allthenutsandbolts 2012-07-12 16:17:37

+0

您的提供者的身份驗證方法應返回實現org.springframework.security.core.Authentication的對象。主體是Authentication對象的一個​​屬性。 – Asynkronos 2012-07-12 17:00:48