1

ApacheShiroを追加したこのJSF2.0/ Springアプリがあり、ユーザーがコマンドボタンをクリックしたり、AJAXリクエストをトリガーしたりしても、セッションタイムアウト後のリダイレクトは発生しません。ブラウザを更新すると機能します。これはすべてのブラウザで発生しています。これが私のapplicationContext.xmlです:

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager" />
        <property name="loginUrl" value="/index.faces"/>
        <property name="filterChainDefinitions">
                <value>
                        /* = authc 
                </value>
        </property>
</bean>
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="opacsRealm" />
</bean>

<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />

<bean id="sha512Matcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">

        <property name="hashAlgorithmName" value="SHA-256" />
        <property name="hashIterations" value="1024" />
</bean>



<bean id="opacsRealm" class="org.apache.shiro.realm.jdbc.JdbcRealm">
        <property name="dataSource" ref="dataSource" />
        <property name="authenticationQuery" 
                value="select PASSWORD, SALT from SEC_USERS where NAME = ?" />
        <property name="userRolesQuery" 
                value="SELECT ROLE_NAME FROM SEC_USERS_ROLES WHERE USER_NAME = ?" />
        <property name="permissionsQuery" 
                value="SELECT permission FROM SEC_ROLES_PERMISSIONS WHERE ROLE_NAME = ?" />
        <property name="permissionsLookupEnabled" value="true" />
        <property name="saltStyle" value="COLUMN" />
        <property name="credentialsMatcher" ref="sha512Matcher"/>
</bean>

セットアップで何か間違ったことをしていますか?web.xmlは次のようになります。

<filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
        <param-name>targetFilterLifecycle</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>
  <!-- web.xml expects the session timeout in minutes: -->
  <session-timeout>1</session-timeout>
</session-config>
4

1 に答える 1

2

メールに返信したところです。何が起こっているのかというと、Ajax 呼び出しでブラウザーによってリダイレクトがシームレスに処理されるため、Shiro はログイン ページにリダイレクトされ、Ajax 要求の最終結果はログイン ページの HTML コンテンツになります。これは実際には望んでいないものです。 !

これを回避する方法の要点は、(カスタム) Shiro フィルターを Ajax Api URL に追加して、サブジェクトが認証されているかどうかをチェックし、ログインにリダイレクトする代わりに、ユーザーが認証されていないことを示すために Ajax 要求が理解する応答を返すことです。この応答をクライアント側で処理すると、ログイン ページ (または、Shiro がログインにリダイレクトするため同じページ) にリダイレクトできますが、移動しようとしていた場所を記憶するように構成できるため、ユーザーを元に戻すことができます。ログインに成功すると正しいページが表示されます)。

私のフィルター実装は、「WWW-Authentication」ヘッダーとカスタム「チャレンジ スキーム」とともに HTTP コード 401 を返します (基本認証チャレンジを行った場合、ブラウザーは基本認証ダイアログをポップアップします。これを行う Shiro フィルターは既に存在します)。 )。

あなたのAjax呼び出しでは、この応答を検出する必要があります.現在、私はそれを行う不格好なエラーコールバックを持っています.

于 2012-08-24T07:49:21.717 に答える