0

SpringSecurityプラグインを使用するgrailsアプリケーションを作成しています。春のセキュリティプラグインの次の属性をオンにしました

grails.plugins.springsecurity.useSessionFixationPrevention = true grails.plugins.springsecurity.SessionFixationPrevention.migrate = true grails.plugins.springsecurity.SessionFixationPrevention.alwaysCreateSession = true

AuthenticationProviderに次のコードがあります

def session = RequestContextHolder.currentRequestAttributes()。getSession()

session.key="いくつかの値"

これで、認証後、RememberMeServiceクラスのloginSuccessメソッドのコードが呼び出され、配置されたセッションで値を取得しようとすると、このエラーが発生します。

j

ava.lang.IllegalStateException:getAttribute:セッションはすでにorg.apache.catalina.session.StandardSession.getAttribute(StandardSession.java:1014)のorg.apache.catalina.session.StandardSessionFacade.getAttribute(StandardSessionFacade.java:110)で無効になっています。 org.codehaus.groovy.grails.web.servlet.mvc.GrailsHttpSession.getAttribute(GrailsHttpSession.java:45)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39 )at 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)at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:40)at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite。 java:54)org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)at org.codehaus.groovy.grails.plugins.web.ServletsGrailsPlugin $ _closure1_closure2.doCall(ServletsGrailsPlugin.groovy:44) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method .invoke(Method.java:597)at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:88)org.codehaus.groovy.runtime.metaclass.ClosureMetaMethod.invoke(ClosureMetaMethod.java:80)at groovy.lang.ExpandoMetaClass.getProperty(ExpandoMetaClass.java:1109)at org.codehaus.groovy.runtime.InvokerHelper.getProperty (InvokerHelper.java:161)at org.codehaus.groovy.runtime.callsite.PojoMetaClassGetPropertySite.getProperty(PojoMetaClassGetPropertySite.java:33)at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:235)at com.teslagovernment.security.TabulaeRememberMeServices.loginSuccess(TabulaeRememberMeServices.groovy:59)at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.successfulAuthentication(AbstractAuthenticationProcessingFilter.java:294)at org.springframework.securityAbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:218)at org.codehaus.groovy.grails.plugins.springsecurity.RequestHolderAuthenticationFilter.doFilter(RequestHolderAuthenticationFilter.java:40)at org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter( java:378)org.codehaus.groovy.grails.plugins.springsecurity.MutableLogoutFilter.doFilter(MutableLogoutFilter.java:79)at org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:378)at org .springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)at org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:378)atorg。springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:167)at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)at 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(ApplicationFilterChain.java:206)at org.codehaus.groovy.grails .web.servlet.filter.GrailsReloadServletFilter.doFilterInternal(GrailsReloadServletFilter.java:104)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain .java:235)orgで。apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.codehaus.groovy.grails.web.servlet.mvc.GrailsWebRequestFilter.doFilterInternal(GrailsWebRequestFilter.java:69)atorg.springframework.web.filter。 OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org .codehaus.groovy.grails.web.filters.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:65)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)at org.apache.catalina.core.ApplicationFilterChain orgの.internalDoFilter(ApplicationFilterChain.java:235)。apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter。 java:76)org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)at org.apache.catalina.core .ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)at org.apache.catalina.core。StandardContextValve.invoke(StandardContextValve.java:191)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)at org .apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)at org.apache.coyote.http11.Http11Processor.process(Http11Processor .java:849)at org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:583)at org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:454)ErrorReportValve.invoke(ErrorReportValve.java:102)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)at org .apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)at org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:583)at org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:454)ErrorReportValve.invoke(ErrorReportValve.java:102)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)at org .apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)at org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:583)at org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:454)org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:454)のHttp11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:583)org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:454)のHttp11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:583)

私の質問は、なぜこれが発生するのか、RememberMeServiceでアクセスできるAuthenticationProviderにデータを設定するにはどうすればよいですか?

ありがとう

4

1 に答える 1

1

認証の直後、コピーされたセッションプロパティにアクセスする前に、リダイレクトを発行してみてください。認証直後のサービスのセッション変数は、リクエストコンテキストから古いセッションを参照している可能性があります。リダイレクトにより、リクエストコンテキストが更新されます。

それ以外の場合は、AuthenticationProvider内のSpringSecurityプリンシパルオブジェクトに追加のプロパティを保存できます。プロバイダーの外部では、applicationContext内にあるspringSecurityServiceを介してプリンシパルにアクセスできます。

MyPrincipalObject obj = springSecurityService.principal
def key = obj.key
于 2012-07-12T16:01:17.003 に答える