惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
Vulnerabilities – Threatpost
有赞技术团队
有赞技术团队
小众软件
小众软件
O
OpenAI News
C
Cyber Attacks, Cyber Crime and Cyber Security
I
Intezer
NISL@THU
NISL@THU
D
Darknet – Hacking Tools, Hacker News & Cyber Security
N
News and Events Feed by Topic
MongoDB | Blog
MongoDB | Blog
阮一峰的网络日志
阮一峰的网络日志
Hacker News: Ask HN
Hacker News: Ask HN
D
Docker
WordPress大学
WordPress大学
Security Archives - TechRepublic
Security Archives - TechRepublic
A
About on SuperTechFans
Stack Overflow Blog
Stack Overflow Blog
C
CERT Recently Published Vulnerability Notes
L
LINUX DO - 最新话题
Application and Cybersecurity Blog
Application and Cybersecurity Blog
M
MIT News - Artificial intelligence
Blog — PlanetScale
Blog — PlanetScale
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
Hacker News - Newest:
Hacker News - Newest: "LLM"
G
Google Developers Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
Google DeepMind News
Google DeepMind News
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
H
Hackread – Cybersecurity News, Data Breaches, AI and More
G
GRAHAM CLULEY
S
Schneier on Security
T
Tor Project blog
Spread Privacy
Spread Privacy
PCI Perspectives
PCI Perspectives
Microsoft Security Blog
Microsoft Security Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
F
Fortinet All Blogs
L
Lohrmann on Cybersecurity
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
T
The Exploit Database - CXSecurity.com
TaoSecurity Blog
TaoSecurity Blog
Apple Machine Learning Research
Apple Machine Learning Research
T
Threat Research - Cisco Blogs
T
Troy Hunt's Blog
罗磊的独立博客

码云笔记

码云笔记详解Markdown格式兼容性、图片显示失效与同步冲突解决 python实现自动爬取某论坛帖子并导出到Word文档的实战教程 高德低调内测 AI 零代码工具“袋马”,切入小微商家轻量化应用开发赛道 一文看懂OSPF:基础概念、工作原理和应用场景 Google终于支持修改Gmail邮箱了?实测告诉你哪些能改,哪些不能改!(附详细教程+FAQ) UCloud 4.6 元 / 月服务器是真的吗? 2026 云服务器完整选购攻略 Webiny:无服务器应用程序框架 Fyrox:现代化的 Rust 游戏引擎 千问发布全球首个原生语言世界模型Qwen-AgentWorld,AI智能体迈入全环境实操新时代 火山引擎上新豆包音频生成模型1.0,AI音频生成实现一键全流程创作 使用Claude Code经常遇到的10个问题 如何批量清理wordpress所有文章和标签,保留设置,保留分类? 谷歌 NotebookLM 内测文献综述矩阵工具,Gemini3.5 赋能 AI 学术结构化研究 京东开源JoyAI-VL-Interaction模型 解锁AI实时视频视觉交互新形态 破解中小商家海报设计难题!MeiGen-AI开源闭环AI设计方案落地 详解Bash set 命令:set -e、set -x 和 set -u 完全指南 Node Plus ?比 pnpm 快 24 倍! Plan-Execute-Replan 和 ReAct 的区别是什么? Anthropic最新报告揭秘:AI编程人机协作成开发者主流工作模式 详解PostgreSQL 18 逻辑复制冲突检测与解决方法 JDK动态代理与CGLIB动态代理的区别是什么? 详解 Linux 中 localhost、127.0.0.1 与 Loopback(回环地址) OpenAI Codex新手入门教程 安装配置AGENTS.md与MCP全流程详解 程序员必备AGENTS.md配置指南 规避AI编码修改乱象 使用 Codex 必装的 12 个插件,你值得拥有! macOS AI CLI工具安装与避坑指南 OpenClaw Gemini Claude报错全套解决方案 智谱AI正式开源GLM-5. 2 模型:主打1M无损上下文与长程代码任务 小米 MiMo Claw 正式版上线 轻量化 Agent 打通金山办公生态 如何定义 Vue 的动态路由?如何获取传过来的动态参数? 记录Claude Code Router 接入过程遇到问题及解决方法 千问AI眼镜凭硬核实力领跑2026智能穿戴赛道 程序员特有的习惯你占了几条! 郝景芳新作半数内容由AI创作,文坛郝景芳AI写作争议再起 使用 iftop、nload、bmon、vnstat 监控 Linux 网络带宽 现代富文本编辑器为什么最终都会抛弃 DOM? Vue 的 v-cloak 和 v-pre 指令有什么作用? 去哪里买抖音号?抖音小号在线购买-抖音小号出售批发 实名闲鱼小号出售|闲鱼账号批发|咸鱼发布账号|出售闲鱼发布账号 zfb号购买-支付宝小号购买-实名支付宝购买号-企业支付宝购买-支付宝小号批发 个人支付宝实名账号出售|v2/v3支付宝账号出售|实名支付宝小号购买 闲鱼账号哪里有卖-闲鱼实名账号购买的途径 Java注解的实现原理是什么? Agentation MemPalace 《置身钉内》之好词好句好段摘抄 AI有声书革命!万象有声全自动生产线,7元/万字颠覆网文有声化行业 详解CentOS 7跨版本迁移Rocky Linux9 生产环境安全升级教程 Java中序列化与反序列化的含义是什么? 18. Python 标准库之 Json 模块
PHP (Yii2) 接入企业级 SSO 单点登录实战教程
夜雨Ya 普通 · 2026-06-29 · via 码云笔记

AI 概述

本文阐述企业多系统引入SSO单点登录的必要性,讲解中心化SSO基于Ticket票据的完整认证流程,并基于Yii2(PHP)给出可落地实现方案:分层定义SSO接口、对接服务、登录回调控制器,自动同步本地用户。同时提出生产环境三大安全防护要点,防范票据重放、权限泄露、数据伪造风险。

目录

文章目录隐藏

  1. 引言:为什么企业级应用需要 SSO?
  2. 一、 核心复盘:SSO 认证究竟是如何运转的?
  3. 二、 实战演练:三步打通 PHP 的 SSO 接入
  4. 三、 架构师避坑:企业级 SSO 的三大防御工事
  5. 四、 总结

PHP (Yii2) 接入企业级 SSO 单点登录实战教程

在企业级应用群落中,孤立的账号体系是研发和用户的噩梦。当公司内部孵化出 OA、CRM、ERP 等多套系统时,如果用户在每个系统都需要重复输入账号密码,不仅体验极差,数据孤立、权限混乱、安全防线难以收拢等痛点也会接踵而至。

SSO(Single Sign-On,单点登录) 正是解决这一痛点的终极方案。它允许用户在多个互信的独立业务系统中,“一次登录,到处通行”。本文将带你从底层机制出发,用 PHP (Yii2 架构) 闭环实现一套工业级的 SSO 接入方案。

一、 核心复盘:SSO 认证究竟是如何运转的?

要接入 SSO,首先必须搞懂它的核心账密置换凭证 —— Ticket(授权码/票据)机制。

我们以经典的中心化认证流为例,当用户访问受保护的业务系统时,其核心步骤如下:

  1. 路由拦截:用户访问业务系统 B。业务系统发现用户未登录,通过 302 重定向将用户引导至 SSO 认证中心。
  2. 凭证分发:用户在 SSO 中心完成账号密码认证。SSO 中心验证通过后,生成一个短期内有效的随机凭证 Ticket,并带着这个 Ticket 重定向回业务系统 B 预留的回调地址。
  3. 后台置换:业务系统 B 拿到 Ticket 后,在后端(Server to Server)发起请求,向 SSO 中心验证 Ticket 的合法性,并换取当前用户的核心信息(如工号、邮箱、角色)。
  4. 本地授信:业务系统 B 验证无误,将用户信息写入本地 Session/Token,自动完成本地登录,页面正常响应。

二、 实战演练:三步打通 PHP 的 SSO 接入

为了让代码更具规范性和扩展性,我们采用 接口定义  服务实现  控制器调用 的三层架构。

步骤 1:定义统一的 SSO 契约接口

首先,我们定义一个规范的接口。不论未来的 SSO 协议是基于标准的 OIDC、OAuth2 还是自研的 CAS,业务层只需要关心这两个核心动作。

<?php
namespace app\components\sso;

interface SSOLoginInterface
{
    /**
     * 获取单点登录中心授权跳转地址
     * @return string 跳转到 SSO 中心的完整 URL
     */
    public function getAuthUrl(): string;

    /**
     * 通过回调获得的 Ticket 换取 SSO 中心的用户信息
     * @param string $ticket 认证票据
     * @return array 用户基础信息数组
     * @throws \Exception 校验失败时抛出异常
     */
    public function getInfoFromTicket(string $ticket): array;
}

步骤 2:落地具体对接的 SSO 服务类

这里我们模拟一个具体的 CompanySSOService。在实际生产环境下,你可以将这里的 curl 请求替换为你们公司的 SSO 中心真实 API。

<?php
namespaceapp\components\sso;

useYii;
useyii\base\Component;

class CompanySSOService extends Component implements SSOLoginInterface
{
    public $ssoHost = 'https://sso.company.com';
    public $clientId = 'crm_system_01';
    public $clientSecret = 'sso_secret_key_xxxxxx';

    publicfunction getAuthUrl(): string
    {
        // 告诉 SSO 中心,认证成功后跳回本地的什么地方
        $callbackUrl = urlencode(Yii::$app->request->getHostInfo() . '/sso/callback');
        return"{$this->ssoHost}/login?client_id={$this->clientId}&redirect_uri={$callbackUrl}";
    }

    publicfunction getInfoFromTicket(string $ticket): array
    {
        $apiExhangeUrl = "{$this->ssoHost}/api/verify-ticket";

        // 发起后端安全的 Server to Server 请求,杜绝前端伪造
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $apiExhangeUrl);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
            'ticket' => $ticket,
            'client_id' => $this->clientId,
            'client_secret' => $this->clientSecret,
        ]));

        $response = curl_exec($ch);
        curl_close($ch);

        $result = json_decode($response, true);
        if (empty($result) || !isset($result['success']) || !$result['success']) {
            thrownew \Exception("SSO 凭证校验失败: " . ($result['message'] ?? '未知错误'));
        }

        return $result['data']; // 返回格式统一包含: username, email, truename
    }
}

步骤 3:编写控制器,闭环回调登录逻辑

在 Yii2 框架中创建 SsoController。它是整个登录闭环的控制中枢,负责处理 Ticket 的接收、新用户的自动常驻同步、以及本地会话的建立。

<?php
namespaceapp\controllers;

useYii;
useyii\web\Controller;
useyii\web\BadRequestHttpException;
useapp\models\User;
useapp\components\sso\CompanySSOService;

class SsoController extends Controller
{
    /**
     * @return CompanySSOService
     */
    privatefunction getSsoService()
    {
        // 建议在 Yii 的 components 中配置注入,此处快速实例化演示
        returnnew CompanySSOService();
    }

    /**
     * 登录入口触发表
     */
    publicfunction actionLogin()
    {
        // 如果本地已经有登录态,直接去后台首页
        if (!Yii::$app->user->isGuest) {
            return$this->redirect(['/dashboard']);
        }

        // 渲染登录引导页,将前端登录按钮的链接指向 SSO 授权页
        return$this->render('login', [
            'ssoUrl' => $this->getSsoService()->getAuthUrl()
        ]);
    }

    /**
     * SSO 中心认证通过后的核心回调接口
     */
    publicfunction actionCallback()
    {
        $ticket = Yii::$app->request->get('ticket');

        if (empty($ticket)) {
            thrownew BadRequestHttpException('授权失败:缺失关键 ticket 参数');
        }

        try {
            // 1. 去 SSO 中心洗白,拿回用户的真实资料
            $ssoUser = $this->getSsoService()->getInfoFromTicket($ticket);

            if (empty($ssoUser['username'])) {
                return$this->renderError('SSO 授信中心返回的用户数据不完整');
            }

            // 2. 统一格式规整(防止大小写引发的账号双胞胎问题)
            $username = strtolower(trim($ssoUser['username']));

            // 3. 检索本地账号仓库,不存在则自动激活“影子上游账号”
            $user = User::find()->where(['username' => $username])->one();

            if (!$user) {
                $user = new User();
                $user->username = $username;
                $user->email = $ssoUser['email'] ?? "{$username}@company.com";
                $user->realname = $ssoUser['truename'] ?? '新员工';
                $user->role = User::ROLE_MEMBER; // 默认赋予普通成员权限
                $user->status = User::STATUS_ACTIVE;

                if (!$user->save()) {
                    thrownew \Exception("本地同步创建用户失败:" . json_encode($user->getErrors()));
                }
            }

            // 4. 正式签发本地登录会话(Session/Cookie 保持 30 天)
            Yii::$app->user->login($user, 3600 * 24 * 30);

            // 5. 顺滑流转至系统内部首页
            return$this->redirect(['/dashboard']);

        } catch (\Exception $e) {
            Yii::error("SSO 登录异常挂起: " . $e->getMessage(), __METHOD__);
            return$this->renderError($e->getMessage());
        }
    }

    privatefunction renderError($msg)
    {
        return$this->render('error', [
            'message' => $msg,
            'retryUrl' => $this->getSsoService()->getAuthUrl()
        ]);
    }
}

三、 架构师避坑:企业级 SSO 的三大防御工事

单点登录一旦被攻破,意味着黑客拿到了进入公司所有系统的万能钥匙。在生产环境中部署时,必须牢记以下三大安全增强准则:

1. Ticket 防重放与防篡改

  • 一次性失效:Ticket 在设计时,必须在 SSO 服务端执行 “阅后即焚” 策略。即任何一个 Ticket 只要被业务系统验证过一次,无论成功与否,在 Redis 中都必须立刻被判定为作废。
  • 时效极短化:Ticket 只是用于置换 Token 的临时媒介,有效期通常应该限制在 30 秒 ~ 1 分钟 之内。

2. 用户动态映射与状态同步

  • 唯一标识锚定:在多系统间匹配用户时,不要直接依赖极易被修改的手机号或用户名。推荐使用全局唯一的员工工号(Staff ID)或不可变的专属 UID 作为主键映射绑定。
  • 状态熔断:如果员工在 SSO 中心被 HR 标记为离职或禁用,当其再次访问业务系统时,业务系统如果直接读取本地 Session,会导致离职员工仍有系统权限。因此,本地 Session 存活期不宜过长,或者业务系统在核心节点需定期(如每 5 分钟)异步校验一次 SSO 态的有效性。

3. 全链路安全防御

  • 加签防伪造:SSO 中心和各业务系统之间,推荐使用基于 RSA 签名 或 JWT 非对称加密 的算法。即使 Ticket 被拦截,黑客在没有私钥的情况下也无法伪造用户信息。
  • 全站 HTTPS:由于全链路都在重定向传输敏感凭证,严禁在 HTTP 纯明文环境下裸奔,所有域名必须无条件强制开启 HTTPS。

四、 总结

通过上述的逻辑重构与代码补充,我们可以发现,PHP 在接入 SSO 时拥有天然的高效和灵活性。只要我们卡死回调接口,做好 Ticket 的后台二次验证和账号的动态同步,就可以快速让任何一个新旧 PHP 项目无缝融入到公司的全局统一账号生态中。

以上关于PHP (Yii2) 接入企业级 SSO 单点登录实战教程的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

1

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » PHP (Yii2) 接入企业级 SSO 单点登录实战教程