单态登录Java方案设计

1. 背景介绍

在一个多模块的Java Web应用中,用户需要登录才能访问系统的某些功能模块,为了方便用户管理和提高用户体验,我们需要设计一个单态登录系统。这个系统可以实现用户在登录后,无需重复登录即可访问其他模块。

2. 系统需求

  • 用户登录后,可以在不同模块间跳转,无需重复登录。
  • 用户注销后,需要重新登录才能访问受限资源。
  • 用户登录信息需要安全存储和传输。

3. 系统设计

3.1 系统架构

下图为单态登录系统的架构图,包含了用户、应用模块和单态登录服务三个核心组件。

erDiagram
    USER ||--o{ MODULE : 使用
    USER ||--o{ SINGLE_SIGN_ON_SERVICE : 登录
    SINGLE_SIGN_ON_SERVICE ||--o{ MODULE : 登录授权
    MODULE ||--o{ SESSION : 会话

3.2 数据库设计

3.2.1 用户表
列名 数据类型 描述
id int 用户ID
username varchar 用户名
password varchar 密码(加密存储)
3.2.2 会话表
列名 数据类型 描述
sessionId varchar 会话ID
userId int 用户ID
expireTime datetime 过期时间

3.3 登录流程

下图为用户登录的序列图,使用了mermaid语法。

sequenceDiagram
    participant USER
    participant MODULE
    participant SINGLE_SIGN_ON_SERVICE

    USER->>MODULE: 请求访问受限资源
    MODULE->>SINGLE_SIGN_ON_SERVICE: 发送登录请求
    SINGLE_SIGN_ON_SERVICE->>USER: 返回登录页面
    USER->>SINGLE_SIGN_ON_SERVICE: 提交用户名密码
    SINGLE_SIGN_ON_SERVICE->>SINGLE_SIGN_ON_SERVICE: 验证用户名密码
    SINGLE_SIGN_ON_SERVICE->>SINGLE_SIGN_ON_SERVICE: 生成会话ID
    SINGLE_SIGN_ON_SERVICE->>MODULE: 返回会话ID
    MODULE->>MODULE: 验证会话ID
    MODULE->>USER: 返回受限资源

3.4 示例代码

3.4.1 用户登录模块
public class LoginController {
    private SingleSignOnService singleSignOnService;

    public LoginController() {
        singleSignOnService = SingleSignOnService.getInstance();
    }

    public void login(String username, String password) {
        boolean authenticated = authenticate(username, password);
        if (authenticated) {
            String sessionId = singleSignOnService.createSession(username);
            // 将sessionId返回给前端
        } else {
            // 登录失败处理
        }
    }

    private boolean authenticate(String username, String password) {
        // 根据用户名和密码进行验证
        return true;
    }
}
3.4.2 单态登录服务模块
public class SingleSignOnService {
    private static SingleSignOnService instance;
    private Map<String, String> sessionMap; // sessionId -> username

    private SingleSignOnService() {
        sessionMap = new HashMap<>();
    }

    public static SingleSignOnService getInstance() {
        if (instance == null) {
            instance = new SingleSignOnService();
        }
        return instance;
    }

    public String createSession(String username) {
        String sessionId = generateSessionId();
        sessionMap.put(sessionId, username);
        return sessionId;
    }

    public String getUsername(String sessionId) {
        return sessionMap.get(sessionId);
    }

    private String generateSessionId() {
        // 生成唯一的会话ID
        return UUID.randomUUID().toString();
    }
}

4. 总结

通过本文的方案设计,我们实现了一个单态登录系统,用户可以登录后在不同模块间跳转,无需重复登录。该系统具有良好的扩展性和安全性,可以为用户提供更好的使用体验。

实际应用中,我们还可以进一步完善系统,例如增加密码加密、会话过期时间的设置等功能,以满足更多的业务需求。