关于shiro 总是302的问题

时间:2022-09-23 21:32:49

我的原因是使用了authc,由于autuc对应的过滤器FormAuthenticationFilter中onAccessDenied方法返回的值都为false,所以访问url时会一直进行循环重定向,解决方案:重写onAccessDenied方法,并注入到shiroFiter中。

附上shiro配置文件:

<!-- shiroFilter -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" />
<!-- 设定角色的登录链接,这里为cas登录页面的链接可配置回调地址 -->
<!-- 登录地址 -->
<property name="loginUrl" value="/login.html"/>
<!-- 登录后跳转到业务页面 -->
<property name="successUrl" value="/index.do"/>
<!-- 错误页面 -->
<property name="unauthorizedUrl" value="/denied.html"/>
<property name="filters">
<map>
<!--将重写了的FormAuthenticationFilter.onAccessDenied方法的类注入到其中-->
<entry key="authc" value-ref="formAuthenticationFilter"></entry>
</map>
</property>

<property name="filterChainDefinitions">
<value>
/login.html=anon
<!--配置静态资源-->
/js/**=anon
/templates/**=anon
/assets/**=anon
/css/**=anon

<!--权限设置-->
/index.do=authc
/user/login.do=anon
/**=authc
</value>
</property>
</bean>

<!-- 重写FormAuthenticationFilteronAccessDenied方法的自定义过滤器 -->
<bean id="formAuthenticationFilter" class="com.jd.risk.giasys.service.realm.filter.MyFilter" />

重写onAccessDenied方法:

package com.jd.risk.giasys.service.realm.filter;

import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
* Created by jianghaisong on 2017/12/17.
*/
public class MyFilter extends FormAuthenticationFilter{
private Logger log = LoggerFactory.getLogger(MyFilter.class);

protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
//进行重写,业务逻辑

}

}