为什么grails的acegi插件在weblogic中不起作用?

时间:2010-02-17 19:34:41

标签: grails weblogic spring-security

我有一个grails(v1.2.1)应用程序,使用acegi插件(v0.5.2)根据Active Directory域对用户进行身份验证。

只要我使用“grails run-app”运行应用程序,一切都很完美;正确的控制器/操作受到保护,用户可以成功登录,无需登录每个页面请求等。

当我在Weblogic 10.3中运行应用程序作为战争时,整个事情就崩溃了。正确的控制器/操作需要身份验证,但在成功登录后,用户始终会被发送到defaultTargetUrl而不是最初请求的URL。成功登录后,如果我尝试返回刚刚导致我登录的同一受保护页面,则会要求再次登录(这是无用的,因为成功登录仍会将我发送到defaultTargetUrl)。如果我故意在登录页面上输入错误的用户/通行证,我会按照设计发回登录页面,但不会出现验证消息。

我添加了一些日志记录/完成了一些调试并确定了以下内容:

  • 无论是从weblogic还是从独立运行,过滤器链都具有相同类的相同类的实例: [org.springframework.security.context.HttpSessionContextIntegrationFilter,  org.codehaus.groovy.grails.plugins.springsecurity.FixRedirectLogoutFilter,  org.codehaus.groovy.grails.plugins.springsecurity.GrailsAuthenticationProcessingFilter,  org.springframework.security.wrapper.SecurityContextHolderAwareRequestFilter,  org.springframework.security.ui.rememberme.RememberMeProcessingFilter,  org.springframework.security.providers.anonymous.AnonymousProcessingFilter,  org.springframework.security.ui.ExceptionTranslationFilter]
  • 当运行独立(grails run-app)时,我的会话在安全过滤器尝试验证用户凭据之前保存了org.codehaus.groovy.grails.FLASH_SCOPE和SPRING_SECURITY_SAVED_REQUEST_KEY属性。在weblogic中,会话在该点没有属性。我已经检查过,属性值类都是可序列化的。
  • 在weblogic中运行时,在HttpSessionContextIntegrationFilter的开头,request.getSession(false)返回null。

1 个答案:

答案 0 :(得分:1)

解决。

如果您发现过这样的行为,请检查您的Cookie。我的浏览器为localhost提供了几个“JSESSIONID”cookie。其中2个JSESSIONID的路径与我的应用程序的路径匹配(一个用于路径“/”,一个用于我的应用程序的路径。

浏览器在HTTP标头中发送了两个匹配的JSESSIONID。标头中的第一个JSESSIONID不是刚刚设置的那个,所以我的应用程序不认为请求是同一会话的一部分。因此,丢失了所有会话属性。特别是登录相关的。