如何实现WordPress与Java Spring的SSO单点登录及会话共享
WordPress与Spring跨服务会话共享实现方案
核心需要解决两个问题:一是认证Cookie对根域下所有路径生效,二是两边的会话校验逻辑完全对齐,优先复用现有WordPress已跑通的认证体系,不要重复造轮子,避免影响现有站点功能。
方案一:共享存储+Cookie互通(改造成本最低,推荐优先使用)
这套方案不需要改动WordPress现有认证逻辑,只需要在Spring侧做适配,完全兼容现有用户名密码、OAuth/OpenID第三方登录能力。
- 第一步:调整WordPress Cookie作用域
先修改WordPress目录下的wp-config.php配置,把认证Cookie的生效范围设置为整个根域,保证所有路径下的服务都能收到请求携带的认证Cookie,添加如下配置:
配置生效后,WordPress生成的登录态Cookie(define('COOKIE_DOMAIN', '.example.com'); // 注意前面的点不能漏,匹配所有根域路径 define('COOKIEPATH', '/'); // Cookie对根域下所有路径生效wordpress_logged_in_*、wordpress_sec_*)会自动在访问example.com/test路径下的Spring服务时携带,不需要额外做跨域处理。 - 第二步:Spring侧适配WordPress会话校验逻辑
WordPress默认不依赖原生PHP Session存储登录态,会话有效标识存在自身数据库的wp_usermeta表session_tokens字段中,Spring侧直接复用这套存储即可:- 给Spring服务分配WordPress数据库的访问权限,核心需要读
wp_users用户表、wp_usermeta会话元数据表,必要时开放session_token的写权限用于续期。 - 在Spring中写一个Servlet过滤器或者Spring Security认证过滤器,拦截所有需要鉴权的请求:先从请求中读取
wordpress_logged_in_开头的Cookie,解析出用户ID、过期时间、签名片段,用wp-config.php中已配置的LOGGED_IN_KEY、SECURE_AUTH_KEY做签名校验,签名合法后再查询数据库中对应用户的session_tokens是否存在、是否在有效期内,校验通过后直接把用户信息填充到Spring Security上下文,完成登录态识别。 - WordPress的Cookie签名规则是固定公开的,不需要逆向源码,直接对齐官方的签名生成逻辑即可,不需要修改WordPress侧任何代码。
- 给Spring服务分配WordPress数据库的访问权限,核心需要读
- 第三步:对齐登录、注销操作
两边不要独立实现登录/注销逻辑,统一复用WordPress原生能力即可:- Spring侧的自定义登录页面只需要保留表单样式,表单提交地址指向WordPress原生的
wp-login.php处理接口,登录成功后配置跳转回Spring业务路径即可,WordPress会自动生成合法的根域认证Cookie,两边同时生效。 - 注销操作同理,不管是WordPress页面还是Spring页面的注销按钮,跳转地址指向WordPress原生注销接口
wp-login.php?action=logout,WordPress会自动清除根域下的认证Cookie、作废数据库中对应的session_token,两边登录态同步失效。 - 现有已对接的OAuth、OpenID第三方登录完全不需要改动,第三方登录成功后WordPress生成的根域Cookie可以直接被Spring识别。
- Spring侧的自定义登录页面只需要保留表单样式,表单提交地址指向WordPress原生的
方案二:网关层统一认证(适合不想在Spring侧写校验逻辑的场景)
如果不想在Spring业务代码里耦合WordPress的校验逻辑,可以在反向代理层做统一认证处理:
- 部署Nginx作为所有
example.com流量的统一入口,配置路径转发规则:根路径请求转发给WordPress服务,/test前缀的请求转发给Spring服务。 - 在Nginx层配置认证逻辑:用
auth_request模块或者Lua脚本,在请求转发前先校验请求携带的WordPress Cookie是否合法,校验逻辑可以直接调用WordPress内置的REST接口做判断,不需要自己实现签名校验。 - 校验通过后,Nginx把解析出的用户ID、用户名、角色等信息通过自定义请求头透传给后端Spring服务,Spring侧只需要信任网关透传的请求头,直接从请求头读取用户信息填充安全上下文即可,不需要处理Cookie解析、数据库校验逻辑。
- 登录、注销操作还是统一转发给WordPress原生接口处理,网关不需要额外写业务逻辑。
注意事项:不要尝试单独搭建一套会话存储再反向同步给WordPress,WordPress现有认证体系已经稳定运行,改动PHP侧的会话逻辑很容易出现第三方登录、密码找回等功能的兼容问题,优先做Spring侧适配或者网关层适配,对现有线上业务的影响最小。
如果需要在Spring侧做登录态自动续期,直接按照WordPress的session_token更新规则操作同一份数据库即可,不要单独生成Spring自定义的认证Cookie,避免两边登录状态不一致。
内容的提问来源于stack exchange,提问作者quasimodo
相关产品推荐
相关产品推荐

