在OA项目对接CAS服务后,每次请求都要去CAS做认证,但是前端的ajax请求,无法重定向到CAS去做认证,目前的解决方法是:
重写 CasFilter.isAccessAllowed(ServletRequest, ServletResponse, Object), 因为它的方法要求每次请求永远都要走认证流程, 这里我们使用父类(AuthenticatingFilter)的流程,父类的流程是拿到我们之前获得的 subject 来做后续流程.
依赖版本
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-cas</artifactId>
<version>1.4.1</version>
</dependency>
CASFilter
public class CasFilter extends AuthenticatingFilter {
...
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
// 不直接返回false
// return false;
/**
*
* 重写了 {@link CasFilter#isAccessAllowed(ServletRequest, ServletResponse, Object)},
*
* 因为它的方法要求每次请求永远都要走认证流程,
*
* 这里我们使用父类(AuthenticatingFilter)的流程,父类的流程是拿到我们之前获得的 subject 来做后续流程.
*
* @see CasFilter#isAccessAllowed(ServletRequest, ServletResponse, Object)
* @see AuthenticatingFilter#isAccessAllowed(ServletRequest, ServletResponse, Object)
*/
return super.isAccessAllowed(request, response, mappedValue);
}
...
}
另外,shiro 推荐使用 buji-pac4j 来代替 shiro-cas , pac4j 支持各种主流认证协议;