Tomcat Spring安全上下文路径解析器
我想定义会话cookie的路径,该路径由spring security设置,以便允许从web应用程序多次登录。例如: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
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路径。请提供您的要求,说明您试图实现的目标,以获得更好的解决方案