当前位置:首页 > PHP

php 实现单点登录

2026-02-13 13:53:12PHP

单点登录(SSO)实现原理

单点登录允许用户通过一次身份验证访问多个关联系统。核心原理是:

  • 用户登录后生成全局会话(如Token),其他系统通过验证该会话实现免登录。
  • 依赖中央认证服务(如独立的SSO服务器)协调各子系统。

PHP实现方案

基于Token的SSO流程

  1. 用户访问系统A
    系统A检查本地无有效会话,重定向到SSO服务器登录页。

  2. SSO服务器验证身份
    用户提交凭证,SSO服务器验证通过后生成Token,存储到缓存(如Redis),并返回Token给浏览器(通过Cookie或URL参数)。

  3. 系统A验证Token
    浏览器携带Token访问系统A,系统A向SSO服务器发起验证请求,确认Token有效后建立本地会话。

  4. 访问系统B
    用户访问系统B时,系统B同样重定向到SSO服务器。SSO服务器发现已有全局会话(通过浏览器Cookie),直接返回Token给系统B完成登录。

关键代码示例

SSO服务器生成Token(PHP)

// 生成Token并存储
$token = bin2hex(random_bytes(32));
$redis->setex("sso_token:$token", 3600, json_encode(['user_id' => 123]));

// 设置全局Cookie(跨域需考虑域名)
setcookie('sso_token', $token, time() + 3600, '/', '.example.com');

子系统验证Token(PHP)

php 实现单点登录

// 从请求获取Token
$token = $_COOKIE['sso_token'] ?? $_GET['token'];

// 向SSO服务器发起验证请求
$response = file_get_contents("https://sso.example.com/verify?token=$token");
$data = json_decode($response, true);

if ($data['valid']) {
    $_SESSION['user'] = $data['user_id']; // 建立本地会话
}

跨域问题解决

  • Cookie跨域:设置Cookie域为父级域名(如.example.com),确保所有子系统可读取。
  • Token传递:通过URL参数或PostMessage(前端跨域通信)传递Token。

安全注意事项

  • 使用HTTPS保护Token传输。
  • Token设置较短有效期并支持吊销。
  • 防范CSRF(如验证Referer或添加CSRF Token)。

扩展方案

  • OAuth2/OpenID Connect:标准化协议,适合复杂场景(如第三方登录)。
  • SAML:企业级协议,需XML处理支持。

通过以上步骤,可实现基础的PHP单点登录系统,需根据实际需求调整验证逻辑和存储方式。

标签: 单点php
分享给朋友:

相关文章

php实现分页

php实现分页

PHP实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (int…

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Ratc…

php 路由实现

php 路由实现

PHP 路由实现方法 在 PHP 中实现路由功能有多种方式,以下是几种常见的实现方法: 使用原生 PHP 实现 通过解析 URL 并匹配对应的控制器和动作: $request = $_SERVER…

php实现排序

php实现排序

PHP 数组排序方法 PHP 提供了多种内置函数用于数组排序,适用于不同的排序需求。以下是常见的排序方法: 按值升序排序 sort() 函数对数组按值升序排序,重置键名(索引数组适用): $num…

php实现文件的下载

php实现文件的下载

PHP 实现文件下载的方法 在 PHP 中实现文件下载功能通常需要设置正确的 HTTP 头信息,并输出文件内容。以下是几种常见的实现方式: 使用 header() 函数强制下载 通过设置 Conte…

php 实现类

php 实现类

PHP 类的基本实现 在 PHP 中,类通过 class 关键字定义,后跟类名和一对花括号。类名通常遵循大驼峰命名法(如 ClassName)。以下是基本语法: class ClassName {…