cas+shiro实现不时时的去请求cas进行身份验证

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

cas+shiro不进行时时去cas验证身份信息,需要用shiro在当前系统有一份完整的认证机构。

那么有一个问题,什么时候去cas校验信息,目前的配置方式:

cas系统设置默认的浏览器session存活时间,当前系统的session存活时间为30分钟,那么当当前系统身份验证失败是,去cas校验。

这里涉及到一个非常重要的节点,就是shiro框架内部是怎么进行cas校验的呢,请看代码:

org.apache.shiro.web.filter.accessControlFilterd还是所有默认验证类的父类,

父类中的redirectToLogin方法就是去请求cas服务器,重新获取验证信息

/*** Convenience method for subclasses that merely acquires the {@link#getLoginUrl() getLoginUrl} and redirects

* the request to that url.

* <p/>

* <b>N.B.</b> If you want to issue a redirect with the intention of allowing the user to then return to their

* originally requested URL, don't use this method directly. Instead you should call

* {@link#saveRequestAndRedirectToLogin(javax.servlet.ServletRequest, javax.servlet.ServletResponse)

* saveRequestAndRedirectToLogin(request,response)}, which will save the current request state so that it can

* be reconstructed and re-used after a successful login.

*

*@paramrequest the incoming <code>ServletRequest</code>

*@paramresponse the outgoing <code>ServletResponse</code>

*@throwsIOException if an error occurs.*/PRotectedvoidredirectToLogin(ServletRequest request, ServletResponse response)throwsIOException {

String loginUrl=getLoginUrl();

WebUtils.issueRedirect(request, response, loginUrl);

}

现在要解决一个问题,就是当前系统的身份验证信息过期了,这个时候页面向后台发起了一个Ajax请求,那么后台拿到这个请求之后直接对这个请求进行转发到cas服务就会出现一个问题:跨域问题。

参考解决办法:因为我的所有后台除了首页是用默认的org.apache.shiro.web.filter.authc.AnonymousFilter类进行身份验证,其他的请求都是通过

org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter进行的权限验证,又因为PermissionsAuthorizationFilter继承了AccessControlFilterd

所以我的解决办法就是创建一个自己的PermissionsAuthorizationFilter覆盖AccessControlFilterd的redirectToLogin方法

importjava.io.IOException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importorg.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;importcom.chenrd.shiro.AuthorRuntimeException;/*** 最最重要的一点,解决了页面没有刷新点击功能,但是后台的author已经被注销的情况下会去发送cas请求而产生的跨域问题

*

*@authorchenrd

*@version2015年12月11日

*@seeMyPermissionsAuthorizationFilter

*@since*/publicclassMyPermissionsAuthorizationFilterextendsPermissionsAuthorizationFilter

{

@OverrideprotectedvoidredirectToLogin(ServletRequest request, ServletResponse response)throwsIOException {thrownewAuthorRuntimeException("身份异常,不进行转发到登录页面");/*String loginUrl = getLoginUrl();

WebUtils.issueRedirect(request, response, loginUrl);*/}

}

然后在shiro的配置文件里面修改如下:

<beanid="myPermissionsAuthorizationFilter"class="com.chenrd.shiro.filter.MyPermissionsAuthorizationFilter"/><beanid="filterChainManager"class="com.chenrd.shiro.filter.CustomDefaultFilterChainManager"><propertyname="loginUrl"value="${cas.url}/login?service=${apply.url}/cas"/><propertyname="successUrl"value="/"/><propertyname="unauthorizedUrl"value="/authority"/><propertyname="customFilters"><util:map><entrykey="cas"value-ref="casFilter"/>

<!--替换默认的权限控制类--><entrykey="perms"value-ref="myPermissionsAuthorizationFilter"/></util:map></property><propertyname="defaultFilterChainDefinitions"><value>/login=anon

/cas=cas

/jaxws/services/**=anon

/**=authc</value></property></bean>

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航