Tomcat Spring安全上下文路径解析器

Tomcat Spring安全上下文路径解析器,tomcat,grails,spring-security,Tomcat,Grails,Spring Security,我想定义会话cookie的路径,该路径由spring security设置,以便允许从web应用程序多次登录。例如: http://localhost:8080/myApp/context1/login http://localhost:8080/myApp/context2/login http://localhost:8080/myApp/context3/login ... 基本上,这可以通过覆盖LoginUrlAuthenticationEntryPoint,simpleralauth

我想定义会话cookie的路径,该路径由spring security设置,以便允许从web应用程序多次登录。例如:

http://localhost:8080/myApp/context1/login
http://localhost:8080/myApp/context2/login
http://localhost:8080/myApp/context3/login
...
基本上,这可以通过覆盖
LoginUrlAuthenticationEntryPoint
simpleralauthenticationfailurehandler
simpleralauthenticationsuccesshandler
simplerullougutsuccesshandler
。但是,我找不到负责设置cookie上下文路径的处理程序,我需要从以下位置覆盖该路径:

/myApp
与适当的等价物:

/myApp/context1
这是必要的,以便允许并行登录这些应用程序


问:如何为tomcat动态更改会话cookie(HttpSession)的cookie路径?

默认情况下,类型为
负责设置cookie

请参考spring security中的默认行为

更新(注释中的指针):在2点验证成功后,spring security
“调用配置的SessionAuthenticationStrategy来处理任何会话相关行为”
。因此,尝试实现自定义的
SessionControlStrategy
扩展框架为应用程序提供的类,看看它是否满足您的需要。
框架提供的策略类包括:


要在成功身份验证后控制cookie创建逻辑及其值:

1) 为您的应用程序选择“记住我”服务
例如: 或

2) 创建自定义类
MyAppTokenBasedRemenberMeServices
扩展所选类,例如:

3) 重写方法
受保护的void setCookie(字符串[]令牌、int-maxAge、HttpServletRequest请求、HttpServletResponse响应)
。它负责创建cookie并将创建的cookie添加到响应中(通过这种方式,您可以控制任何cookie值,例如上下文路径值)。此方法位于类中:

4) 映射为
rememberMeServices


我希望这有帮助

您的应用程序容器负责向客户端发送会话cookie。 在Spring安全代码中,您只能看到这样的行:

HttpSession session = request.getSession();
Spring安全源代码中没有会话cookie创建逻辑。这就是为什么没有要实现的接口或提供自定义路径的配置属性

要指定将分配给web应用程序创建的任何会话cookie的路径,您可以放置:

<web-app>
    <session-config>
        <cookie-config>
            <path></path>
        </cookie-config>
    </session-config>
</web-app>

web.xml
描述符中

但是,您希望在一个web应用程序中有多个会话。 为什么不为每个用户上下文部署新的应用程序?这是最合乎逻辑的方法

编辑:
我担心您想要实现一些不需要修改会话就可以轻松完成的任务。您的问题看起来更像是授权,而不是身份验证。也许您需要为每个上下文使用角色?还是访问控制列表?

扩展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配置文件中配置它。。。这次我想我找到了你要找的东西。看


我认为您可以在grails中创建一个

来完成这项工作,这也将负责创建HttpSession吗?我认为第一个链接确实非常好。但是,1-4仅对持久登录cookie(记住我cookie)有用,但我需要会话cookie。@crudolf-是否在创建会话时设置值?i、 e.
HttpSession
value@crudolf-作为一种解决方法,您可以实现
HttpSessionListener
。通过这种方式,
sessionCreated(HttpSessionEvent se)
方法接收会话创建的通知。然后操纵你的应用程序
HttpSession
值。听起来不错,有可能覆盖此侦听器中cookie的路径吗?@crudolf-我已经验证了
HttpSessionEvent
方法,它没有按预期工作;因为在成功身份验证之前已创建会话。所以这个事件并没有被提起。我已经用
SessionControlStrategy
信息更新了帖子。请看这是否有帮助。回答你的问题:因为上下文的数量是动态的。所以我想创建会话的地方不会太多。显然,我可以通过调用
HttpSession
中的一些方法手动设置路径。可以为此修补spring安全性吗?
HttpSession
中没有这样的方法。恐怕你需要把所有的饼干都拿出来。查找名为
JSESSIONID
的cookie。克隆它。将上下文相关路径设置为克隆的cookie。对于以前的cookie,将
maxAge
设置为
0
(删除它)。最后将这两个cookie添加到响应中(由于将前者的
maxAge
设置为
0
,因此前者被删除)。这是脏的。研究Tomcat/您的容器文档。也许有一些供应商的方法可以做到这一点,而不必修改会话。我担心您想要实现一些不需要修改会话就可以轻松完成的功能。您的问题看起来更像是授权,而不是身份验证。也许您需要为每个上下文使用角色?或者访问控制列表?对于并发身份验证和允许用户拥有多个会话,配置ConcurrentSessionFilter并将maximumSession属性设置为-1以允许ConcurrentSessionControl策略中的无限会话难道还不够吗?@Ravi:可能,你能稍微解决一下吗?如何在文件夹之间区分cookie?@crudolf,但是为什么需要区分cookie路径。请提供您的要求,说明您试图实现的目标,以获得更好的解决方案