3

Webアプリからの複数のログインを許可するために、SpringSecurityから設定されるセッションCookieのパスを定義したいと思います。例えば:

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

基本的にLoginUrlAuthenticationEntryPoint、これは、、、、を上書きすることで可能になります。ただし、Cookieのコンテキストパスの設定を担当するハンドラーが見つかりません。このハンドラーから上書きする必要があります。SimpleUrlAuthenticationFailureHandlerSimpleUrlAuthenticationSuccessHandlerSimpleUrlLogoutSuccessHandler

/myApp

適切な同等物に:

/myApp/context1

これは、これらのアプリへの並列ログインを可能にするために必要です。

Q:TomcatのセッションCookie(HttpSession)のCookieのパスを動的に変更するにはどうすればよいですか?

4

5 に答える 5

2

アプリケーションコンテナは、セッションCookieをクライアントに送信する責任があります。Spring Securityコード内には、次のような行のみが表示されます。

HttpSession session = request.getSession();

SpringSecurityのソースコードにはセッションCookie作成ロジックはありません。そのため、実装するインターフェイスや、カスタムパスを提供するための構成属性はありません。

Webアプリケーションによって作成されたセッションCookieに割り当てられるパスを指定するには、次のようにします。

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

web.xml記述子で。

ただし、1つのWebアプリケーションで多くのセッションを実行する必要があります。ユーザーコンテキストごとに新しいアプリケーションをデプロイしてみませんか?これが最も論理的なアプローチです。

編集:セッションをいじくり回すことなく簡単に実行できる何かを達成したいと思います。問題は、認証ではなく承認のように見えます。コンテキストごとにロールを使用する必要があるかもしれませんか?またはアクセス制御リスト?

于 2012-12-03T16:15:14.343 に答える
0

デフォルトでは、タイプorg.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServicesのBe​​anrememberMeServices がCookieの設定を担当します。

于 2012-12-01T14:28:22.787 に答える
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 に答える
-1

SpringSecurityでのsuccessfulAuthenticationのデフォルトの動作を参照してください。

更新(コメントからのポインタ): 2ポイントでの認証の成功について、春のセキュリティ "Invokes the configured SessionAuthenticationStrategy to handle any session-related behaviour"。したがって、SessionControlStrategyアプリケーションにカスタム拡張フレームワークが提供するクラスを実装してみて、それがニーズを満たしているかどうかを確認してください。
フレームワークが提供するストラテジークラスは、 ConcurrentSessionControlStrategyNullAuthenticatedSessionStrategySessionFixationProtectionStrategyです。


認証とその値が成功した後にCookie作成ロジックを制御するには:

1)アプリケーションの[Remember me services]を選択します。
例: TokenBasedRememberMeServicesまたはPersistentTokenBasedRememberMeServices

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

わかりました...今回はあなたが探しているものを見つけたと思います。この答えを見てください

フィルターを作成するグライルでそれを行うことができると思います

于 2012-12-06T22:02:47.160 に答える