Java 单点登录简单实现

一、流程概述

在开始介绍具体步骤之前,我们先来了解一下整个单点登录的流程。单点登录(Single Sign-On, SSO)是一种允许用户使用一套凭证(用户名和密码)访问多个应用系统的身份认证机制。简单来说,就是用户只需要登录一次,在任意一个应用系统中都可以实现自动登录。

以下是实现单点登录的基本流程,请参考下表:

步骤 描述
1 用户访问应用系统A,该系统检测到用户未登录,跳转到SSO登录页面
2 用户在SSO登录页面输入用户名和密码进行登录
3 SSO系统验证用户的登录信息,生成一个令牌(token),并将该令牌存储起来
4 SSO系统将令牌作为参数附加在重定向URL上,将用户重定向回应用系统A,并附带令牌信息
5 应用系统A接收到重定向请求,解析URL中的令牌信息
6 应用系统A根据令牌信息,向SSO系统发送验证请求
7 SSO系统验证令牌信息,并返回验证结果给应用系统A
8 应用系统A根据验证结果,决定是否允许用户访问

二、具体步骤

1. 创建SSO系统

首先,我们需要创建一个SSO系统,用于处理用户的登录和验证请求。

代码
public class SsoSystem {
    
    private static Map<String, String> tokens = new HashMap<>();
    
    public static String generateToken(String userId) {
        String token = UUID.randomUUID().toString();
        tokens.put(token, userId);
        return token;
    }
    
    public static boolean validateToken(String token) {
        return tokens.containsKey(token);
    }
    
    // ...
}
代码解释
  • generateToken(String userId) 方法用于生成一个令牌,并将令牌与用户ID存储在 tokens 集合中。
  • validateToken(String token) 方法用于验证令牌是否有效,即检查 tokens 集合中是否包含该令牌。

2. 创建应用系统A

接下来,我们需要创建一个应用系统A,用于接收用户的登录请求,并向SSO系统发送验证请求。

代码
public class AppSystemA {
    
    public void login(String username, String password) {
        // 处理用户登录请求
        // ...
        
        // 向SSO系统发送验证请求
        String token = SsoSystem.generateToken(username);
        
        // 重定向到应用系统A首页,并附带令牌信息
        String redirectUrl = " + token;
        // ...
    }
    
    public void handleRedirect(String token) {
        // 解析URL中的令牌信息
        // ...
        
        // 向SSO系统发送验证请求
        if (SsoSystem.validateToken(token)) {
            // 验证通过,允许用户访问
            // ...
        } else {
            // 验证失败,拒绝用户访问
            // ...
        }
    }
    
    // ...
}
代码解释
  • login(String username, String password) 方法用于处理用户的登录请求,其中会调用 SsoSystem.generateToken(username) 生成一个令牌,并将令牌作为参数附加在重定向URL上。
  • handleRedirect(String token) 方法用于处理重定向请求,其中会解析URL中的令牌信息,并调用 SsoSystem.validateToken(token) 向SSO系统发送验证请求,根据验证结果决定是否允许用户访问。

3. 创建其他应用系统

除了应用系统A外,我们还可以创建其他应用系统,以实现单点登录的效果。

代码
public class AppSystemB {
    
    public void handleRedirect(String token) {
        // 解析URL中的令牌信息
        // ...
        
        // 向SSO系统发送验证请求
        if (SsoSystem.validateToken(token)) {
            // 验证通过,允许用户访问
            // ...
        } else {
            // 验证失败,拒绝用户访问