大家好,我是小悟。
- 想象一下你去遊樂園,買了一張通票(登錄),然後就可以玩所有項目(訪問各個系統),不用每個項目都重新買票(重新登錄)。這就是單點登錄(SSO)的精髓!
SSO的日常比喻
- 普通登錄:像去不同商場,每個都要查會員卡
- 單點登錄:像微信掃碼登錄,一掃全搞定
- 令牌:像遊樂園手環,戴着就能證明你買過票
下面用代碼來實現這個"遊樂園通票系統":
代碼實現:簡易SSO系統
import java.util.*;
// 用户類 - 就是我們這些想玩項目的遊客
class User {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
// getters 省略...
}
// 令牌類 - 遊樂園手環
class Token {
private String tokenId;
private String username;
private Date expireTime;
public Token(String username) {
this.tokenId = UUID.randomUUID().toString();
this.username = username;
// 令牌1小時後過期 - 遊樂園晚上要關門的!
this.expireTime = new Date(System.currentTimeMillis() + 3600 * 1000);
}
public boolean isValid() {
return new Date().before(expireTime);
}
// getters 省略...
}
// SSO認證中心 - 遊樂園售票處
class SSOAuthCenter {
private Map<String, Token> validTokens = new HashMap<>();
private Map<String, User> users = new HashMap<>();
public SSOAuthCenter() {
// 預先註冊幾個用户 - 辦了年卡的遊客
users.put("zhangsan", new User("zhangsan", "123456"));
users.put("lisi", new User("lisi", "abcdef"));
}
// 登錄 - 買票入場
public String login(String username, String password) {
User user = users.get(username);
if (user != null && user.getPassword().equals(password)) {
Token token = new Token(username);
validTokens.put(token.getTokenId(), token);
System.out.println(username + " 登錄成功!拿到遊樂園手環:" + token.getTokenId());
return token.getTokenId();
}
System.out.println("用户名或密碼錯誤!請重新買票!");
return null;
}
// 驗證令牌 - 檢查手環是否有效
public boolean validateToken(String tokenId) {
Token token = validTokens.get(tokenId);
if (token != null && token.isValid()) {
System.out.println("手環有效,歡迎繼續玩耍!");
return true;
}
System.out.println("手環無效或已過期,請重新登錄!");
validTokens.remove(tokenId); // 清理過期令牌
return false;
}
// 登出 - 離開遊樂園
public void logout(String tokenId) {
validTokens.remove(tokenId);
System.out.println("已登出,歡迎下次再來玩!");
}
}
// 業務系統A - 過山車
class SystemA {
private SSOAuthCenter authCenter;
public SystemA(SSOAuthCenter authCenter) {
this.authCenter = authCenter;
}
public void accessSystem(String tokenId) {
System.out.println("=== 歡迎來到過山車 ===");
if (authCenter.validateToken(tokenId)) {
System.out.println("過山車啓動!尖叫聲在哪裏!");
} else {
System.out.println("請先登錄再玩過山車!");
}
}
}
// 業務系統B - 旋轉木馬
class SystemB {
private SSOAuthCenter authCenter;
public SystemB(SSOAuthCenter authCenter) {
this.authCenter = authCenter;
}
public void accessSystem(String tokenId) {
System.out.println("=== 歡迎來到旋轉木馬 ===");
if (authCenter.validateToken(tokenId)) {
System.out.println("木馬轉起來啦!找回童年記憶!");
} else {
System.out.println("請先登錄再玩旋轉木馬!");
}
}
}
// 測試我們的SSO系統
public class SSODemo {
public static void main(String[] args) {
// 創建認證中心 - 遊樂園大門
SSOAuthCenter authCenter = new SSOAuthCenter();
// 張三登錄
String token = authCenter.login("zhangsan", "123456");
if (token != null) {
// 拿着同一個令牌玩不同項目
SystemA systemA = new SystemA(authCenter);
SystemB systemB = new SystemB(authCenter);
systemA.accessSystem(token); // 玩過山車
systemB.accessSystem(token); // 玩旋轉木馬
// 登出
authCenter.logout(token);
// 再嘗試訪問 - 應該被拒絕
systemA.accessSystem(token);
}
// 測試錯誤密碼
authCenter.login("lisi", "wrongpassword");
}
}
運行結果示例:
zhangsan 登錄成功!拿到遊樂園手環:a1b2c3d4-e5f6-7890-abcd-ef1234567890
=== 歡迎來到過山車 ===
手環有效,歡迎繼續玩耍!
過山車啓動!尖叫聲在哪裏!
=== 歡迎來到旋轉木馬 ===
手環有效,歡迎繼續玩耍!
木馬轉起來啦!找回童年記憶!
已登出,歡迎下次再來玩!
=== 歡迎來到過山車 ===
手環無效或已過期,請重新登錄!
請先登錄再玩過山車!
用户名或密碼錯誤!請重新買票!
總結一下:
單點登錄就像:
- 一次認證,處處通行 🎫
- 不用重複輸入密碼 🔑
- 安全又方便 👍
好的SSO系統就像好的遊樂園管理,既要讓遊客玩得開心,又要確保安全!
謝謝你看我的文章,既然看到這裏了,如果覺得不錯,隨手點個贊、轉發、在看三連吧,感謝感謝。那我們,下次再見。
您的一鍵三連,是我更新的最大動力,謝謝
山水有相逢,來日皆可期,謝謝閲讀,我們再會
我手中的金箍棒,上能通天,下能探海