单点登录是什么
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,即用户只需要记住一组用户名和密码就可以登录所有有权限的系统。
如下为一个单点登录的简易图解: 当用户第一次访问应用系统1时,需要进行用户登录,认证中心通过了用户的登录信息后会返回用户凭证ticket与用户信息,当用户访问应用系统2或者应用系统3的时候会携带用户凭证ticket,认证中心会验证ticket的有效性,如果验证通过则返回当前登录的用户信息。
单点登录流转图
存在两个系统OA与PRO系统,浏览器第一次访问OA系统的时候需要进行用户登录,OA系统登录成功后,浏览器可以不用登录直接访问PRO系统。
单点登录会话如何统一管理?
单点登录会话通过cookie的方式统一管理,因为cookie是客户端技术,不同系统之间在同一个浏览器下面可以共享cookie,在cookie中存放用户登录凭证,服务端获取cookie中用户登录凭证后,从而在缓存中查找登录用户信息。
为什么不直接在cookie中存放登录用户信息,从而减少在服务端使用缓存服务器来存放登录用户信息?
1:cookie的数据存放在客户的浏览器上,可以分析存放本地的cookie从而获取用户登录信息,所以cookie不是很安全。
2:cookie保存的数据不能超过4k。
用户未登录的情况如何跳转到认证中心进行用户登录?
在拦截器中会判断cookie中是否存放用户凭证,用户未登录则cookie中用户登录凭证为空,所以可以通过重定向的方式跳转到认证中心的登录首页。
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// TODO Auto-generated method stub
//cookie中查找用户凭证token
String token = CookieUtils.getCookieValue(request, "TOKEN");
if(StringUtils.isNotEmpty(token)){
String resultJson=HttpClientUtil.doGet("Http://"+ssoAddress+":"+ssoPort+"/token/"+token);
//把json对象转为java对象
CommonResult commonResult=JSON.parseObject(resultJson, CommonResult.class);
if(commonResult!=null && commonResult.getCode()==2000){
JSONObject jo=(JSONObject) commonResult.getData();
SSOUserVo uservo = jo.toJavaObject(SSOUserVo.class);
if(uservo!=null){
return true;
}
}
}
//重定向到认证中心的登录首页
response.sendRedirect("Http://"+ssoAddress+":"+ssoPort+"/page/login?redirectUrl="+request.getRequestURL().toString());
return false;
}
Springboot+redis单点登录代码实现
https://github.com/lx-sunday/sso.git
sso-server为认证中心
sso-oa为oa系统
sso-pro为pro系统
项目在启动之前需要安装并启动redis