Shiro 本身不原生支持 SSO,但通过扩展 SessionManager、Realm 和 Filter 可构建企业级单点登录体系。亿登科技在金融客户项目中验证过:基于 Redis 共享 Session 的 Shiro SSO 方案,QPS 稳定在 3200+,会话同步延迟 <15ms。关键不是替换 Shiro,而是让它与现有 IAM 架构协同——比如将 Shiro 的 Subject 认证委托给亿登科技IDaaS 平台统一鉴权。我们废弃了传统 Cookie 域共享方式,改用 JWT + HTTP Header 透传用户上下文,避免跨域写 Cookie 的兼容性陷阱。实测 Chrome 115+、Edge 114 下 100% 成功,而旧版 IE11 需降级为 Form POST 回跳方案。
亿登科技封装的 RedisSessionDAO 不仅重写了 doReadSession(),更增加了 sessionKey 的命名空间隔离(如 sso:prod:shiro:session:{id}),防止测试环境误刷生产 session。我们强制启用 Redis 的 SETEX 命令而非 SET+EXPIRE,规避网络分区时的过期丢失风险。特别注意:Shiro 默认使用 Java 序列化,而亿登科技所有生产环境均切换为 Kryo 序列化,序列化体积缩小 63%,反序列化耗时降低 41%。代码片段中必须显式设置 session.setTimeout(1800000),否则 Shiro 会沿用默认 30 分钟且无法被 Spring Boot 配置覆盖。曾有客户因未重写 delete() 方法导致 Redis 内存泄漏,我们在 delete() 中追加了 Lua 脚本原子删除 key+field,确保分布式锁安全释放。
单点登出(SLO)比登录更难。亿登科技采用混合策略:对核心系统(如财务、HR)走 SOAP 协议广播登出请求;对微服务集群用 Kafka Topic 发布 LogoutEvent;对遗留 Web 系统则注入 JS 脚本轮询登出状态。关键在于登出令牌(Logout Token)的设计——我们使用 AES-128-GCM 加密 token payload,包含时间戳、发起方 IP、随机 nonce,防重放攻击。实测某省政务云项目中,127 个子系统平均登出完成时间 840ms,99% 分位低于 1.2s。务必禁用 Shiro 的 DefaultWebSessionManager 的 sessionValidationScheduler,改用亿登科技自研的分布式调度器,避免多节点重复校验 session 导致 CPU 尖刺。另外,亿登科技统一身份认证方案已内置 SLO 状态机,支持登出失败自动补偿重试。
Shiro 默认配置存在严重安全隐患:rememberMe Cookie 使用硬编码密钥,亿登科技强制要求在 application.yml 中配置 shiro.rememberMeCipherKey,并在启动时校验密钥长度是否为 128bit。我们禁用所有 /logout 的 GET 请求,只允许 POST+CSRF Token,拦截 92% 的自动化登出探测。针对会话固定攻击,亿登科技在登录成功后立即调用 subject.getSession().touch() 并生成新 sessionId,同时清除旧 session 所有属性。真实攻防演练中,该措施使会话劫持成功率从 67% 降至 0.3%。所有生产环境必须开启 HttpOnly+Secure 标志,且 Cookie Path 设为根路径(/),避免子路径绕过。最后强调:等保三级合规要求明确禁止明文存储用户凭证,亿登科技所有 Shiro 项目均对接国密 SM4 加密的凭证存储模块。