1

Flex 4、BlazeDS、および WebLogic 10.3.5 を使用して Flex アプリケーションに再ログインすると問題が発生します。

問題を引き起こすユースケースは次のようなものです。

  1. ブラウザでアプリケーションを起動します。
  2. j_security_check アクションでログイン フォーム ページにリダイレクトします。
  3. ログインしてアプリケーションを使用する。
  4. ブラウザの「戻る」ボタンを押します。
  5. 再びログインフォームページに来ます。
  6. 再度ログインします。
  7. BlazeDS で例外を取得し、Flex/ActionScript で障害をキャッチします。

WLS のログでキャッチされた例外:

[BlazeDS]Unexpected error encountered in Message Broker servlet
flex.messaging.LocalizedException: The FlexSession is invalid.
        at flex.messaging.FlexSession.checkValid(FlexSession.java:943)
        at flex.messaging.FlexSession.getUserPrincipal(FlexSession.java:254)
        at flex.messaging.HttpFlexSession.getUserPrincipal(HttpFlexSession.java:286)
        at flex.messaging.MessageBrokerServlet.service(MessageBrokerServlet.java:296)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3717)
        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)
        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
        at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2277)
        at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2183)
        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1454)
        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:209)
        at weblogic.work.ExecuteThread.run(ExecuteThread.java:178)

Flex/ActionScript でキャッチされた障害:

faultCode: Client.Error.MessageSend
faultString: Send failed
faultDetail: Channel.Connect.Failed error NetConnection.Call.Failed: HTTP: Status 500: url: 'http://server:port/web-project/messagebroker/amf'

最初のセッションがまだ有効でアクティブな間に、BlazeDS が 2 番目のセッションを取得しているようです。

それがまさにこの問題の原因であり、それらをエレガントに解決する方法を知っている人はいますか? いくつかのヒントがありますが、それらが十分に適しているかどうかわかりません:

  • Flex/ActionScript で障害をキャッチし、ログアウト ページにリダイレクトしてセッションを無効にしてから、ログイン ページにリダイレクトして新しいセッションを作成します。
  • JavaScriptでブラウザの「戻る」ボタンを無効にします。

提案、説明、アドバイスをいただければ幸いです。ありがとう。

4

2 に答える 2

1

問題はセッション固定です。

何が起こるのですか:

  • ログインします
  • セッションを受けます
  • FlexSession を取得します (セッション属性として設定)
  • 戻るボタンをクリックします
  • ログインします (古い jsessionid を渡します)

Spring の SessionFixationProtectionStrategy:

  • jsessionid のセッションが有効であることを検出します
  • 古いセッションの属性を抽出します
  • セッションを無効にする (破棄する)
  • 新しいセッションを作成
  • 古いセッションの属性を新しいセッションに転送します

古いセッションが破棄されると、FlexSession は「無効」になります。

FlexSessions は、セッションの作成時に再度作成されます。また、戦略が無効化される同じ参照を渡すため (太いロシア語のアクセントで)、「問題があります」

これは、戦略bMigrateAttributesを falseに設定することで簡単に解決されました。

<security:session-management session-authentication-strategy-ref="sas" />
  <bean id="sas class="org.springframework.security.web.authentication.session.SessionFixationProtectionStrategy"   p:migrateSessionAttributes="false"/>

http://static.springsource.org/spring-security/site/docs/3.0.x/reference/session-mgmt.html

お役に立てれば

于 2013-01-22T21:55:53.917 に答える