目录
SSO单点登录(一)理论知识总结
SSO单点登录(二)基于redis的服务端
SSO单点登录(三)基于session的服务端
SSO单点登录(四)客户端的设计与实现
SSO单点登录(五)服务端集成dubbo版本
持续更新中…
其他的内容不过多废话,服务端的详细内容可以见SSO单点登录(二)基于redis的服务端
本来,主要是针对核心逻辑,由redis改为session的处理方式,如果非要问一个优缺点,那就简单说明几点
- redis可以拓展很多,比如分布式系统等,但是登录数据不会销毁,安全性存在一定问题,就会出现一人登录,多人共享的效果
- session的话,目前只能管理本地会话,浏览器关闭session会销毁,安全性更好一点
ok,直接来看一下代码的改造逻辑吧,部分对象这里就不列举了,见前一篇
1. 登录核心逻辑
//1.校验用户(获取用户逻辑省略)
UserInfo userInfo = ...;
if(userInfo == null){
return "用户不存在"
}
//2.生成token(生成唯一标识即可,可按自己的要求定义)
String token = UUID.randomUUID().toString();
userInfo.setToken(token);
//3.用户登录信息写入session
HttpSession session = httpServletRequest.getSession(true);
session.setAttribute("loginUser", userInfo);
return "登录成功";
2. 认证鉴权核心逻辑
/**
* SSO登录地址
*/
private static final String SSO_LOGIN_URL = "...";
/**
* @param token 登录唯一标识
* @param indexUrl 目标子系统首页
*/
public AuthResult applyAuth(String token, String indexUrl) {
//要拼接的跳转地址(sso登录后,可根据redirectUrl参数决定跳转到主页还是目标系统页面)
String redirectUrl = StringUtils.isEmpty(indexUrl) ? "" : "?redirectUrl=" + indexUrl;
AuthResult authResult = new AuthResult();
HttpSession session = httpServletRequest.getSession(true);
UserInfo userInfo = (UserInfo)session.getAttribute("loginUser");
if(userInfo == null){
//校验失败 - 跳转到登录页
authResult.setAuth(false);
authResult.setRedirectUrl(SSO_LOGIN_URL + redirectUrl);
}else{
//校验成功 - 返回用户信息
authResult.setAuth(true);
authResult.setUserInfo(userInfo);
}
return authResult;
}
其他逻辑基本没变,就是存储用户的时候,由redis变为session了,优缺点上面也说了,针对项目及背景的不同,技术方案的选择也会不同,选择适合的才是最好的。