shiro整合cas多次验证或者重复重定向问题

很多人在学习shiro+cas的时候都会遇到的问题:多次验证或者重复重定向。

先上基本配置:


        
        
        
        
        
        
            
                
                
                
                
            
        
        
            
                /assets/** = anon
                /interface/** = anon
                /system/user/forgetPwd = anon
                /login = cas
                /j_spring_cas_security_logout = logout
                /** = authc
            
        
    

    
    
        
        
        
    

    
        
        
    

    

    
        
        
        
        
    
    
    
        
        
    
    

看配置可能大家会发现,其实跟网上其他教程中的配置没多大区别,但是又有点不同,接下来给大家解释:

1、将successUrl放在casFilter而不是放在shiroFilter。

我的理解是:既然我的认证改为了cas认证,那么我就应该把成功与失败都交给cas,而不是交给shiro。

2、重写authc与casFilter。

很多人初学都会遇到多次验证或者重复重定向,然后拿着异常网上各种查资料,到最后会发现,是因为shiro封装了指定的返回路劲:/、/index、上次request地址

通过配置文件配置的路劲,只是一个辅助作用,在shiro找不到跳转路劲后才会跳转到配置的路劲,所以我们要做的就是:重写跳转方法。

@Override
    protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request,
                                     ServletResponse response) throws Exception {
        boolean flag = true;
        String successUrl = this.getSuccessUrl();
        if("".equals(successUrl)){
            successUrl = DEFAULT_SUCCESS_URL;
        }
        WebUtils.issueRedirect(request, response, successUrl, null, flag);
        //we handled the success redirect directly, prevent the chain from continuing:
        return false;
    }
这里的DEFAULT_SUCESS_URL就是默认的 / ,如果你的配置中有指定就放在这里可以不管,不然还是换个默认地址吧。

3、重点来了,如果没有耐心看到这里,那么只能抱歉,而看到这里的童鞋,继续向下看吧^_^:

上面说了多次验证的情况,还原下场景:A用户登录,发现应用系统后台先报错,然后又验证通过了,cas服务端登陆一次,TGT验证成功,但是ST第一次验证失败,但是生成的第二个ST却验证成功了,回调后咱进入了应用系统界面。这个问题的出现比较奇葩,解决方式很简单。

按照我上面贴出来的配置启动项目,你很容易就能复现这个错误,原因就是我在里面多加了一个参数:


        
        
        
    
实话实说,这个问题根据源码看是因为subjectFactory的参数不一样导致的,猜想应该是CasSubjectFactory创建subject过程中与cas有交互,默认的并没有导致的,不过我并没有深入研究。

备注:之所以重写authc权限验证,我举个例子:A用户在A电脑登录了子系统B,进入了管理菜单。然后A用户在B电脑登录了,同时管理员把A用户的权限改了,进不去子系统B了。这个时候A用户在A电脑已经在后台被CAS强制登出了,A用户需要重新登录才行。如果补充些authc,则会出现以下情况:A用户回到A电脑登录,验证通过,在跳转路劲时系统会发现,你上次访问历史是子系统B,但是现在已经没有权限了,怎么办,报错呗。而重写authc过滤器后,shiro就会直接说,你是重新登录的,我把首页给你,要进哪个系统自己去看。

你可能感兴趣的:(java)