Spring安全上下文路径解析器

时间:2012-12-01 13:07:26

标签: tomcat grails spring-security

我想定义会话cookie的路径,该路径是从spring安全性设置的,以便允许来自web-app的多次登录。 E.g:

http://localhost:8080/myApp/context1/login
http://localhost:8080/myApp/context2/login
http://localhost:8080/myApp/context3/login
...

基本上可以通过覆盖LoginUrlAuthenticationEntryPointSimpleUrlAuthenticationFailureHandlerSimpleUrlAuthenticationSuccessHandlerSimpleUrlLogoutSuccessHandler来实现。但是我找不到一个处理程序,它负责设置我需要覆盖的cookie上下文路径:

/myApp

到适当的等价物:

/myApp/context1

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

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

5 个答案:

答案 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扩展框架提供的类,看看它是否满足您的需求 框架提供的策略类是ConcurrentSessionControlStrategyNullAuthenticatedSessionStrategySessionFixationProtectionStrategy


在成功验证及其值后控制Cookie创建逻辑:

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

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