两个基于LDAP的PHP应用实现单点登录的解决方案咨询
Symfony + DokuWiki LDAP场景跨应用登录实现方案
以下三个方案可根据你的应用部署场景选择:
方案1:同域Cookie共享(成本最低,适合同一级域名部署场景)
如果你的两个应用部署在同一个一级域名下,例如Symfony用sys.example.com、DokuWiki用wiki.example.com,优先用这个方案:
- 核心逻辑:两个应用共享绑定到一级域名的身份Cookie,Cookie内存储LDAP用户的唯一标识(如uid、sAMAccountName),双方共用一套Cookie签名规则,不需要重复校验密码。
- Symfony侧配置:修改
security.yaml中身份Cookie的domain参数为一级域名(格式为.example.com,前面带点),同步开启HttpOnly、Secure属性防止Cookie被窃取篡改。 - DokuWiki侧配置:修改
conf/local.php中的cookieDomain参数为同一个一级域名,新增自定义认证钩子,当检测到有效共享Cookie存在时,直接读取Cookie内的用户唯一标识查询LDAP完成登录,跳过默认登录流程。
方案2:中心化SSO对接(扩展性最强,适合跨域名部署场景)
如果两个应用不在同一个一级域名下,推荐对接统一SSO认证中心:
- 核心逻辑:所有登录逻辑收敛到独立的SSO认证中心处理,认证中心对接现有LDAP服务完成账号校验,通过CAS或者OAuth2协议给两个应用下发授权票据,应用校验票据合法即可完成登录。
- Symfony侧适配:直接用官方Security组件对接SSO服务的对应协议即可,不需要大幅修改现有代码。
- DokuWiki侧适配:启用内置的oauth认证插件,配置和Symfony相同的SSO服务参数即可完成对接。
- 额外优势:后续新增其他需要对接LDAP的业务应用时,直接对接SSO中心即可,不需要重复调整认证逻辑。
方案3:JWT跨域校验(轻量方案,适合不想搭建独立SSO服务的场景)
- 核心逻辑:用户在任意一个应用登录后,生成带签名的JWT Token,Token内存储LDAP用户唯一标识,两个应用共用同一个JWT签名密钥。用户跳转访问另一个应用时将JWT带过去,接收方校验JWT签名合法后,直接查询LDAP完成登录。
- 注意事项:JWT需要设置合理的过期时间,全程走HTTPS传输避免泄露。
内容的提问来源于stack exchange,提问作者Ayoub Benhadou
相关产品推荐
相关产品推荐

