单态登录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. 总结
通过本文的方案设计,我们实现了一个单态登录系统,用户可以登录后在不同模块间跳转,无需重复登录。该系统具有良好的扩展性和安全性,可以为用户提供更好的使用体验。
实际应用中,我们还可以进一步完善系统,例如增加密码加密、会话过期时间的设置等功能,以满足更多的业务需求。