前后端分离(Vue + SpringBoot)整合CAS的单点登录
网上查询了一些单点登录的方案,综合分析貌似CAS最靠谱,于是毫不犹豫的扎进了CAS的坑中。。。前方高能→前端配合修改小哥吐血鼎力支持,博客:http://www.musheng.art/blogs/tech/sso/CAS认证前后端分离单点登录调研.html#实施公司项目都是前端Vue 后端SpringBoot的前后端分离架构,尝试过SpringBoot整合CAS的小伙伴都知道,其实配置是...
网上查询了一些单点登录的方案,综合分析貌似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之处:登录之后不能单点登出 哪位兄弟解决了麻烦分享下,感谢 抱拳。
特此申明:该方案经确认可实施!!!
更多推荐
所有评论(0)