目录
SSO单点登录(一)理论知识总结
SSO单点登录(二)基于redis的服务端
SSO单点登录(三)基于session的服务端
SSO单点登录(四)客户端的设计与实现
SSO单点登录(五)服务端集成dubbo版本
持续更新中…
代码都是临时编写的,可能会有不严谨的地方,主要表明其中的核心思想
1.概述
服务端就是SSO项目的建设,它包含了统一登录,认证鉴权等,为目标子系统提供管理统一管理账号的职责。
2.服务端设计要点
- 统一登录入口
- 账号管理
- 认证鉴权
3.核心代码设计
3.1 定义用户对象
import lombok.Data;
import java.io.Serializable;
/**
* @author yanghao
* @version UserInfo.java, v 0.1 2019-06-14 08:29
*/
@Data
public class UserInfo implements Serializable {
private static final long serialVersionUID = 3237076458096649506L;
/**
* 登录标识
*/
private String token;
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 真实姓名
*/
private String realName;
}
3.2 定义鉴权返回对象
import lombok.Data;
import java.io.Serializable;
/**
* @author yanghao
* @version AuthResult.java, v 0.1 2019-06-14 08:35
*/
@Data
public class AuthResult implements Serializable {
private static final long serialVersionUID = -859598615166362412L;
/**
* 认证结果
*/
private boolean auth;
/**
* 重定向url(认证结果仅为false时返回)
*/
private String redirectUrl;
/**
* 用户信息(认证结果仅为true时返回)
*/
private UserInfo userInfo;
}
3.3 登录核心逻辑
//1.校验用户(获取用户逻辑省略)
UserInfo userInfo = ...;
if(userInfo == null){
return "用户不存在"
}
//2.生成token(生成唯一标识即可,可按自己的要求定义)
String token = UUID.randomUUID().toString();
userInfo.setToken(token);
//3.用户登录信息写入redis(当天有效)
redisCache.set("login." + token, userInfo, 24 * 60 * 60, TimeUnit.SECONDS);
return "登录成功";
3.4 认证鉴权核心逻辑
/**
* SSO登录地址
*/
private static final String SSO_LOGIN_URL = "...";
@Autowired
private RedisCache redisCache;
/**
* @param token 登录唯一标识
* @param indexUrl 目标子系统首页
*/
public AuthResult applyAuth(String token, String indexUrl) {
//要拼接的跳转地址(sso登录后,可根据redirectUrl参数决定跳转到主页还是目标系统页面)
String redirectUrl = StringUtils.isEmpty(indexUrl) ? "" : "?redirectUrl=" + indexUrl;
AuthResult authResult = new AuthResult();
UserInfo userInfo = redisCache.get("login." + token, UserInfo.class);
if(userInfo == null){
//校验失败 - 跳转到登录页
authResult.setAuth(false);
authResult.setRedirectUrl(SSO_LOGIN_URL + redirectUrl);
}else{
//校验成功 - 返回用户信息
authResult.setAuth(true);
authResult.setUserInfo(userInfo);
}
return authResult;
}
4.总结
- 目标子系统根据认证鉴权接口applyAuth,判断是否登录成功,如auth为true,说明登录成功,可以跳转至目标子系统首页;如果auth为false,返回一个跳转页面,此页面会跳转sso登录页面
- 认证鉴权后,会有redirectUrl参数,根据这个参数决定登录跳转到sso首页还是目标子系统首页
- 本文是基于redis做的,后面会更新一版基于session去做,小伙伴尽情期待吧
- 编码临时做的,不严谨的地方请包涵,重在表达核心逻辑思想
- 本文由作者原创,转载请表明出处https://blog.csdn.net/weixin_43968234/article/details/91953545