SSO单点登录(二)基于redis的服务端

目录

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
发布了39 篇原创文章 · 获赞 58 · 访问量 1万+

猜你喜欢

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