我有这个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>
答案 0 :(得分:2)
刚刚回复了你的邮件。发生的事情是浏览器在Ajax调用中无缝地处理重定向,因此Shiro会重定向到登录页面,而Ajax请求的最终结果是登录页面的HTML内容,这不是你想要的!
如何解决这个问题的要点是在Ajax Api URL中添加一个(自定义)Shiro过滤器,检查Subject是否经过身份验证,而不是重定向到login,返回一个Ajax请求理解的响应,表明用户未登录。此响应的客户端处理然后可以重定向到登录页面(或者可能是同一页面,因为Shiro将重定向到登录,但可以配置为记住您尝试去的地方,因此用户在成功登录后返回正确的页面。
我的过滤器实现返回Http代码401以及“WWW-Authentication”标头和自定义“挑战方案”(如果您执行了基本的身份验证挑战,那么浏览器会弹出其基本身份验证对话框 - 已经有一个Shiro过滤器这样做。)
在你的Ajax调用中你需要检测这个响应,目前我有一个笨重的错误回调来做它但我认为应该可以修改JavaScript库(JQuery,无论如何)来无缝地处理它。