首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Laravel 實作 SSO 單點登入完整方案

     編輯:PHP 綜合知識

單點登入(SSO)讓用戶在多個子系統間一次登入、處處可用。本文基於 Laravel 框架,以三個二級域名為例,詳細實作 Ticket 驗證流程、全局中間件攔截與緩存同步機制。

一、架構設計

  • a.baidu.com:認證中心(登入、發票)。
  • b.baidu.com / c.baidu.com:業務子系統(攜帶 Ticket 請求認證中心驗證)。

二、認證中心邏輯

登入成功後生成 Ticket 存入緩存(120 秒),重定向回目標系統:

private function getTicketUrl($source) {
    $ticket = md5(time() . $key);
    Cache::put($ticket, $user, 120);
    return $source . '?ticket=' . $ticket;
}

三、子系統全局中間件

App\Http\Middleware\CasAuthenticate 攔截請求,驗證 Ticket:

public function handle($request, Closure $next) {
    $ticket = $request->input('ticket');
    if ($ticket) {
        $result = json_decode(file_get_contents('https://a.baidu.com/auth/check-ticket?ticket=' . $ticket), true);
        if ($result['state'] == 'SUCCESS') {
            $request->session()->flush();
            Auth::loginUsingId($result['result']['uid']);
            return redirect($request->url());
        }
    }
    return $next($request);
}

四、已知問題與改進方向

  1. Ticket 有效期較短(120 秒),若用戶在 b 系統活躍後跳轉至 c,可能因 a 系統緩存過期而需重新登入。
  2. 可引入 Refresh Token 機制,或由子系統定期向認證中心續期。
  3. 生產環境建議使用 JWT 或 OAuth2 標準協議替代自建 Ticket 方案。

本文提供基礎實作思路,實際項目請根據安全性與擴展性需求進一步完善。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved