如何为含多子目录站点、独立数据库的Web应用实现统一身份认证
这个方案完全适配你同根域名、主服务为Laravel的场景,改造成本最低、兼容性最好,不需要额外引入重型第三方身份服务。
核心实现逻辑
所有服务都部署在同一个根域名下,Cookie默认支持同域名所有子路径共享,直接利用这个特性做身份凭证传递即可:
- 所有身份逻辑完全收拢到根目录的Laravel服务处理,用户注册、登录、密码修改、权限校验都以Laravel为唯一数据源
- 登录成功后,Laravel生成的
sessionCookie的path属性设置为/,确保所有子路径的服务都能读取到该Cookie - 每个子服务无需自行开发登录认证逻辑,仅需要增加一层轻量身份校验中间件,收到请求时把携带的Session ID发送给Laravel的认证校验接口验证身份有效性即可
各子服务适配方法
WordPress/WooCommerce 适配
- 禁用WordPress自带的登录、注册功能,所有登录入口直接跳转至根域名Laravel的登录页面
- 开发极简WP插件,在WP初始化钩子中完成身份校验:读取全局Cookie中的Laravel Session ID,调用Laravel侧提供的内部校验接口,接口返回合法用户信息的话,直接在WP侧自动登录对应用户,同步创建/更新WP本地的用户数据(不需要同步密码,密码仅存储在Laravel侧)
Express应用适配
- 开发极简Express中间件,所有请求进入后先校验Cookie中的Session ID,调用Laravel校验接口,验证有效则把用户基础信息挂载到请求对象上,无效则直接跳转至Laravel登录页
- Express侧不需要存储用户敏感信息,仅需拿到Laravel返回的用户ID、用户名等基础信息即可支撑业务逻辑
安全性优化要点
- Laravel生成的Session Cookie必须开启
HttpOnly、Secure(HTTPS环境下)属性,避免XSS攻击窃取凭证 - Laravel侧的校验接口设置为内部接口即可,不需要对外开放,所有子服务走内网调用该接口,降低暴露风险
- 退出登录逻辑统一在Laravel侧处理,销毁Session后所有子服务的身份校验自然失效,不需要单独处理各子服务的登出逻辑
后续扩展方案
如果后续需要把服务部署到不同根域名下,只需要将当前方案升级为标准OAuth2.0 SSO即可,Laravel官方Passport扩展包已经完整支持OAuth2.0协议,改造成本极低。
内容的提问来源于stack exchange,提问作者junior_developer_70
相关产品推荐
相关产品推荐

