PHP跨域单点登录方案

跨域项目的登录统一,一直挺让人头疼的。是用 PHP 写多个子系统,怎么做到用户在一个系统登录后,其他系统也能自动识别?用跨域 SSO搞定就行了。

SSO 的原理其实不复杂,就是靠一个SESSIONID在多个系统之间共享身份信息。你可以理解成:一个人拿着通行证,从一个门走进去,后面的门都能直接放行,前提是这些门都认这个通行证。

PHP环境里,比较靠谱的做法是把SESSIONID放在服务器的文件系统里,而不是内存。这样多个服务之间可以通过共享文件来识别用户。比如你用dddl.php搞个中间件,专门 session 的读写,也可以封装成类继承SessionHandlerInterface

CodeIgniter用起来也蛮方便的。你在config/config.php里把sess_driver设为files,设置统一的cookie_domain,就能支持多个子域名共享 cookie 了。

记得在用户登录的时候,把SESSIONID写到Set-Cookie头里返回给浏览器,别忘了设置path=/和跨域domain,不然别的服务读不到。其他子系统只要能读取这个SESSIONID,就能自动识别登录状态,体验上就丝滑了。

不过,跨域 SSO 的安全问题也不能忽视。CSRF 防护SESSIONID 加密、定期更新 ID 这些都得做上。别光能用,还得放心用。

想看更详细的实现?下面这些文章和源码链接你可以挨个看看,思路基本差不多:

如果你正在搞多个子系统,又不想重复造登录的轮,试试把 SSO 整上,真的省心不少。

rar 文件大小:3.26KB