大家好,我是小悟。


  • 想象一下你去遊樂園,買了一張通票(登錄),然後就可以玩所有項目(訪問各個系統),不用每個項目都重新買票(重新登錄)。這就是單點登錄(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系統就像好的遊樂園管理,既要讓遊客玩得開心,又要確保安全!

單點登錄:一次登錄,全網通行_Java

謝謝你看我的文章,既然看到這裏了,如果覺得不錯,隨手點個贊、轉發、在看三連吧,感謝感謝。那我們,下次再見。

您的一鍵三連,是我更新的最大動力,謝謝

山水有相逢,來日皆可期,謝謝閲讀,我們再會

我手中的金箍棒,上能通天,下能探海