我想定义会话cookie的路径,该路径是从spring安全性设置的,以便允许来自web-app的多次登录。 E.g:
http://localhost:8080/myApp/context1/login
http://localhost:8080/myApp/context2/login
http://localhost:8080/myApp/context3/login
...
基本上可以通过覆盖LoginUrlAuthenticationEntryPoint
,SimpleUrlAuthenticationFailureHandler
,SimpleUrlAuthenticationSuccessHandler
,SimpleUrlLogoutSuccessHandler
来实现。但是我找不到一个处理程序,它负责设置我需要覆盖的cookie上下文路径:
/myApp
到适当的等价物:
/myApp/context1
这是必需的,以便允许并行登录这些应用程序。
问:如何为tomcat动态更改会话cookie(HttpSession)的cookie路径?
答案 0 :(得分:2)
您的应用程序容器负责向客户端发送会话cookie。 在Spring Security代码中,您只能看到如下行:
HttpSession session = request.getSession();
Spring Security源代码中没有会话cookie创建逻辑。这就是为什么没有实现接口或配置属性来提供自定义路径的原因。
要指定将分配给您的Web应用程序创建的任何会话cookie的路径,您可以:
<web-app>
<session-config>
<cookie-config>
<path></path>
</cookie-config>
</session-config>
</web-app>
在web.xml
描述符中。
但是,您希望在一个Web应用程序中拥有多个会话。 为什么不为每个用户上下文部署新的应用程序?这是最合乎逻辑的方法。
编辑: 我担心你想要在不修改会话的情况下轻松完成某些事情。您的问题看起来更像授权而不是身份验证。也许您需要为每个上下文使用角色?或访问控制列表?
答案 1 :(得分:0)
默认bean rememberMeServices类型为org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices 负责设置cookie
答案 2 :(得分:0)
扩展InlineExplodedTomcatServer
package myapp
import org.grails.plugins.tomcat.InlineExplodedTomcatServer
import org.grails.plugins.tomcat.TomcatLoader
import grails.util.GrailsNameUtils
import org.apache.catalina.connector.Connector
import org.apache.catalina.startup.Tomcat
import org.apache.coyote.http11.Http11NioProtocol
import org.codehaus.groovy.grails.lifecycle.ShutdownOperations
import org.codehaus.groovy.grails.plugins.PluginManagerHolder
import org.codehaus.groovy.grails.plugins.GrailsPluginUtils
import static grails.build.logging.GrailsConsole.instance as CONSOLE
import org.apache.tomcat.util.scan.StandardJarScanner
import org.springframework.util.ReflectionUtils
class MyappInlineExplodedTomcatServer extends InlineExplodedTomcatServer {
MyappInlineExplodedTomcatServer(String basedir, String webXml, String contextPath, ClassLoader classLoader) {
super(basedir, webXml, contextPath, classLoader)
context.setSessionCookieDomain(System.getProperty('mydomain.com'))
context.setSessionCookiePath('/mypath')
}
}
扩展tomcat服务器工厂
package myapp
import grails.web.container.EmbeddableServer
import org.grails.plugins.tomcat.TomcatServerFactory
class MyappServerFactory extends TomcatServerFactory {
EmbeddableServer createInline(String basedir, String webXml, String contextPath, ClassLoader classLoader) {
new MyappInlineExplodedTomcatServer(basedir, webXml, contextPath, classLoader)
}
}
在events.groovy中设置服务器工厂
eventRunAppStart = {
System.setProperty 'grails.server.factory','myapp.MyappServerFactory'
}
}
显然,此配置仅在使用grails“run-app”运行时应用,而不是在tomcat或其他服务器上部署时应用。在tomcat上,您必须在tomcat配置文件中配置它
答案 3 :(得分:-1)
请参考spring security中successfulAuthentication的默认行为。
更新(评论指针):,在2点,春季安全"Invokes the configured SessionAuthenticationStrategy to handle any session-related behaviour"
成功验证。因此,尝试为您的应用程序实现自定义SessionControlStrategy
扩展框架提供的类,看看它是否满足您的需求
框架提供的策略类是ConcurrentSessionControlStrategy,NullAuthenticatedSessionStrategy,SessionFixationProtectionStrategy
在成功验证及其值后控制Cookie创建逻辑:
1)为您的应用选择记住我的服务
例如:
TokenBasedRememberMeServices或PersistentTokenBasedRememberMeServices
2)创建一个扩展所选类的自定义类MyAppTokenBasedRemenberMeServices
,例如:TokenBasedRememberMeServices
3)覆盖方法protected void setCookie(String[] tokens, int maxAge, HttpServletRequest request, HttpServletResponse response)
。它负责创建cookie并将创建的cookie添加到响应中(这样您就可以控制任何cookie值,例如context-path值)。此方法位于Class:AbstractRememberMeServices
4)为rememberMeServices
我希望这有帮助!
答案 4 :(得分:-1)
好的......这次我想我找到了你要找的东西。看this answer
我认为你可以用grails创建filter