1

我有这个 JSF 2.0/Spring 应用程序,它添加了 Apache Shiro,并且当用户单击命令按钮或触发 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 内容,这并不是您真正想要的!

如何解决这个问题的要点是向您的 Ajax Api url 添加一个(自定义)Shiro 过滤器,以检查主题是否经过身份验证,而不是重定向到登录返回您的 Ajax 请求理解的响应以指示用户不是登录。客户端处理此响应然后可以重定向到登录页面(或者可能是同一页面,因为 Shiro 将重定向到登录但可以配置为记住您尝试去的地方,从而将用户带回成功登录后的正确页面)。

我的过滤器实现返回 Http 代码 401 以及“WWW-Authentication”标头和自定义“挑战方案”(如果您进行了基本身份验证挑战,那么浏览器将弹出其基本身份验证对话框 - 已经有一个 Shiro 过滤器可以执行此操作)。

在您的 Ajax 调用中,您需要检测此响应,目前我有一个笨拙的错误回调,但我认为应该可以修改 JavaScript 库(JQuery 等)以无缝处理。

于 2012-08-24T07:49:21.717 回答