网上查询了一些单点登录的方案,综合分析貌似CAS最靠谱,于是毫不犹豫的扎进了CAS的坑中。。。

前方高能→前端配合修改小哥吐血鼎力支持,博客:http://www.musheng.art/blogs/tech/sso/CAS认证前后端分离单点登录调研.html#实施

公司项目都是前端Vue 后端SpringBoot的前后端分离架构,尝试过SpringBoot整合CAS的小伙伴都知道,其实配置是很简单的,在此不详叙述,关键点在于前端Vue发起的是ajax请求,是XMLHttpRequest,而正常CAS单点登录页面重定向后返回的状态码是302,Vue捕捉不到这个状态码,导致前端无法实现页面的重定向。

我下载使用的CAS-Server版本是5.2.0的,客户端引入的cas-client-core版本是3.4.1的,我是对cas-client-core的源码进行的修改和重新编译。找到AuthenticationFilter类的doFilter()方法,可以看出是在方法最后进行了页面的重定向,我对这个重定向进行了修改,改为返回特定的状态码(此处返回401)代码贴上:

                    PrintWriter out = response.getWriter();
                    response.setContentType("application/json; charset=UTF-8");
                    String http = "";
                    String redirectUrl = serviceUrl;
                    if(redirectUrl.contains("https://")){
                        http += "https://";
                        redirectUrl = redirectUrl.substring(8);
                    }else if(redirectUrl.contains("http://")){
                        http += "http://";
                        redirectUrl = redirectUrl.substring(7);
                    }
                    int index = redirectUrl.indexOf("/");
                    String host = redirectUrl.substring(0,index+1);
                    out.println(new AResponse(401,http + host + "redirect"));
//                    this.authenticationRedirectStrategy.redirect(request, response, urlToRedirectTo);

其中这个AResponse类只是封装的统一返回类,没别的方法,需要的小伙伴可以留言。

前端接收到这个401之后,会做相应的跳转,具体可以参考以上推荐的前端博客。

下面介绍客户端部分:

在controller中创建一个重定向的接口,方法如下:

@RequestMapping("redirect")
public String redirect(@RequestParam String url, HttpSession session) {
    String sessionId = session.getId();
    return "redirect:" +url+"?JSESSIONID="+sessionId;
}

这个方法的目的是将当前已认证过的sessionid带到重定向的页面。

到此,CAS的认证基本完成。

以下是本方案的bug之处:登录之后不能单点登出 哪位兄弟解决了麻烦分享下,感谢 抱拳。

特此申明:该方案经确认可实施!!!

 

Logo

前往低代码交流专区

更多推荐