SSO单点登录(三)基于session的服务端

目录

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了,优缺点上面也说了,针对项目及背景的不同,技术方案的选择也会不同,选择适合的才是最好的。

发布了39 篇原创文章 · 获赞 58 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43968234/article/details/92770558