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

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.
     *
     * @param request  the incoming <code>ServletRequest</code>
     * @param response the outgoing <code>ServletResponse</code>
     * @throws IOException if an error occurs.
     */
    protected void redirectToLogin(ServletRequest request, ServletResponse response) throws IOException {
        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方法

    

import java.io.IOException;

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

import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter;

import com.chenrd.shiro.AuthorRuntimeException;

/**
 * 最最重要的一点,解决了页面没有刷新点击功能,但是后台的author已经被注销的情况下会去发送cas请求而产生的跨域问题
 *
 * @author chenrd
 * @version 2015年12月11日
 * @see MyPermissionsAuthorizationFilter
 * @since
 */
public class MyPermissionsAuthorizationFilter extends PermissionsAuthorizationFilter
{

    @Override
    protected void redirectToLogin(ServletRequest request, ServletResponse response) throws IOException {
        throw new AuthorRuntimeException("身份异常,不进行转发到登录页面");
        /*String loginUrl = getLoginUrl();
        WebUtils.issueRedirect(request, response, loginUrl);*/
    }
}

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

  

    <bean id="myPermissionsAuthorizationFilter" class="com.chenrd.shiro.filter.MyPermissionsAuthorizationFilter"/>

    <bean id="filterChainManager" class="com.chenrd.shiro.filter.CustomDefaultFilterChainManager">
        <property name="loginUrl" value="${cas.url}/login?service=${apply.url}/cas"/>
        <property name="successUrl" value="/"/>
        <property name="unauthorizedUrl" value="/authority"/>
        <property name="customFilters">
            <util:map>
                <entry key="cas" value-ref="casFilter"/>          <!--替换默认的权限控制类-->
                <entry key="perms" value-ref="myPermissionsAuthorizationFilter"/>
            </util:map>
        </property>
        <property name="defaultFilterChainDefinitions">
            <value>
                /login=anon
                /cas=cas
                /jaxws/services/**=anon
                /**=authc
            </value>
        </property>
    </bean>

  

时间: 2024-11-11 17:15:21

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

用Retrofit发送请求中添加身份验证

用Retrofit发送请求中添加身份验证====================在安卓应用开发中, retrofit可以极大的方便发送http网络请求,不管是GET, POST, 还是PUT, DELETE, Retrofit使用起来都非常简单.只要稍微看一下文档,就知道怎么用.但文档没有具体说明怎么怎么发送带auth信息的请求.本文分享两个代码片段. 比如要发送这样的请求,在header中添加身份验证信息,用户名和密码: http -a user1:user1password POST htt

HTTP 请求未经客户端身份验证方案“Anonymous”授权。从服务器收到的身份验证标头为“Negotiate,NTLM”

转自:http://www.cnblogs.com/geqinggao/p/3270499.html 近来项目需要Web Service验证授权,一般有两种解决方案: 1.通过通过SOAP Header身份验证. 2.通过集成windows身份验证. 今天我就尝试了已第二种方式进行授权,首先发布Web Service到IIS,然后选择身份验证,启用Windows身份验证,禁用匿名身份验证 发布好了Web Servive就要在Client端调用了,我用的是VS2008,在client端项目引用中右

cas+shiro遇到的一个问题:统一注销失败,session的注销跟创建事件都能捕获到,原因是:

最近遇到一个非常麻烦的问题,cas+shiro 统一注销的失败,cas正常注销掉,但是应用里面的用户信息没有被注销掉 跟踪问题: 首先怀疑SingleSignOutHttpSessionListener监听器没有正常工作没有把应用的session注销掉,这里可以跟大家讲一下cas 客户端及服务器的注销原理 1,客户端发送一个注销请求到cas server,跟踪casorg.jasig.cas.CentralAuthenticationServiceImpl类的destroyTicketGrant

多个服务器总结: 将session保存到专门的一个服务器上,所有服务器都去请求数据共享Session

原理:多个服务器间想共享session,就相当于共享取多台主机上的一个变量,所以共享的思路就是让大家都能读取变量,实现的方法可以通过将session保存到专门的一个服务器上,所有服务器都去请求数据,也memcache实现session共享将这些服务器都配置成使用同一组Memcached服务器就可以, 一.提出问题: 为了满足足够大的应用,满足更多的客户,于是我们架设了N台Web服务器(N>=2),在多台Web服务器的情况下,我们会涉及到一个问题:用户登陆一台服务器以后,如果在跨越到另一台服务器的

java如果去请求一个网页的数据

我们可以通过在java程序中模拟浏览器一样,把数据抓下来,具体方法是在java程序中set header和cookie,下面是一个例子: public class NetConnection { public static final int MAX_HOTWORDS_FILE_SIZE = 256 * 1024; public static void main(String[] args) { send("http://tuan.aibang.com/shenzhen/new_2033549.

cas sso单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析

转:http://blog.csdn.net/ae6623/article/details/8848107 1)PPT流程图:ppt下载:http://pan.baidu.com/s/1o7KIlom 一.用户第一次访问web1应用. ps:上图少画了一条线,那一条线,应该再返回来一条,然后再到server端,画少了一步...谢谢提醒.而且,重定向肯定是从浏览器过去的.我写的不严谨,画的比较通俗了...因该像下面这张图一样就ok了!!PPT自己下载下来修改吧,我就不改了. 二.用户第一次访问we

Shiro处理简单的身份验证的分析及实例

在两天在看Shiro,开涛兄的教程还是写的比较易读,差不多看了一天吧,就准备拿来用了. 可能是想的太简单了,在用的时候确实碰到一些问题,就拿最简单的身份验证来说吧: 需要说明的是,这里是集成在Spring中使用,身份验证我直接使用了Shiro提供的 org.apache.shiro.web.filter.authc.FormAuthenticationFilter 如果url应用了该拦截器,那么处理流程是大致这样的: 由于之前用markdown花的流程图显示不下,所以还是改成图片形式了. 比如我

跟开涛老师学shiro -- 身份验证

身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能验证用户身份: principals:身份,即主体的标识属性,可以是任何东西,如用户名.邮箱等,唯一即可.一个主体可以有多个principals,但只有一个Primary principals,一般是用户名/密码/手机号. credentials:证明

第二章 身份验证——《跟我学Shiro》

身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能验证用户身份: principals:身份,即主体的标识属性,可以是任何东西,如用户名.邮箱等,唯一即可.一个主体可以有多个principals,但只有一个Primary principals,一般是用户名/密码/手机号. credentials:证明