3

我想定义从 spring security 设置的会话 cookie 的路径,以允许从 web-app 进行多次登录。例如:

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

这是必需的,以便允许并行登录这些应用程序。

Q:tomcat如何动态改变session cookie(HttpSession)的cookie路径?

4

5 回答 5

2

您的应用程序容器负责向客户端发送会话 cookie。在 Spring Security 代码中,您只会看到如下行:

HttpSession session = request.getSession();

Spring Security 源代码中没有 session-cookie-creation 逻辑。这就是为什么没有接口来实现或配置属性来提供自定义路径的原因。

要指定将分配给由您的 Web 应用程序创建的任何会话 cookie 的路径,您可以输入:

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

在你的web.xml描述符中。

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

编辑:恐怕您想要实现无需修改会话即可轻松完成的事情。您的问题看起来更像是授权而不是身份验证。也许您需要为每个上下文使用角色?还是访问控制列表?

于 2012-12-03T16:15:14.343 回答
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 配置文件中配置它

于 2012-12-04T15:09:31.110 回答
0

默认情况下,org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices类型的 bean rememberMeServices 负责设置 cookie

于 2012-12-01T14:28:22.787 回答
-1

请参考spring security中successfulAuthentication的默认行为。

更新(来自评论的指针):在 2 点成功认证时,spring security "Invokes the configured SessionAuthenticationStrategy to handle any session-related behaviour"。因此,尝试SessionControlStrategy为您的应用程序实现自定义扩展框架提供的类,看看它是否满足您的需求。
框架提供的策略类有ConcurrentSessionControlStrategyNullAuthenticatedSessionStrategySessionFixationProtectionStrategy


成功认证后控制 cookie 创建逻辑及其值:

1) 为您的应用程序选择记住我的服务
,例如: TokenBasedRememberMeServicesPersistentTokenBasedRememberMeServices

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

3)覆盖方法protected void setCookie(String[] tokens, int maxAge, HttpServletRequest request, HttpServletResponse response)。它负责创建 cookie 并将创建的 cookie 添加到响应中(这样您可以控制任何 cookie 值,例如上下文路径值)。此方法位于类中:AbstractRememberMeServices

4)映射新创建的自定义类rememberMeServices

我希望这有帮助!

于 2012-12-03T16:04:24.527 回答
-1

好的……这一次我想我找到了你要找的东西。看看这个答案

我认为你可以在创建过滤器的 grails 中做到这一点

于 2012-12-06T22:02:47.160 回答