在我的应用程序中,我有两个不同的身份验证网关,它们分别工作得很好:
OAuth 1.0 ( service-to-service ) 将 ROLE_OAUTH 提供给用户;在这里,我对用户一无所知,只有一些关于它在 Principal 对象中使用的服务的上下文信息;
为用户提供 ROLE_USER 的标准基于表单的身份验证;在这里,我有关于我的用户的完整信息,但没有关于它在 Principal 对象中使用的服务的上下文信息;
现在我想实现两步身份验证:1)OAuth 然后基于表单。
复杂性在于,我不想在步骤 1 (OAuth) 之后丢失存储在 Principal 中的特定于上下文的信息;我只想在完成基于表单的身份验证后将一些新的用户特定信息添加到安全上下文以及一个新角色 ROLE_USER,所有这些都在同一个身份验证会话中。
能否顺利实施?如何在第二步(基于表单的身份验证)中提取现有的 Principal 信息并将其添加到新的 Principal 中?
有没有不重新发明轮子的“模板解决方案”?
我目前的直接解决方案是:
我已经通过角色 ROLE_OAUTH 验证了用户并打开了身份验证会话;
为二维步骤创建一个单独的路径,例如/oauth/login;
用户输入他的凭据后,我在控制器中的安全链之外处理它们,手动检查凭据;
如果成功,手动更新安全上下文而不丢失身份验证会话,然后将用户重定向到请求的受 ROLE_USER 保护的资源;
但我不喜欢它,这似乎很蹩脚,因为我必须手动处理第二个安全请求..
如何以 Spring-ish 的方式正确实现这一点?谢谢你。
PS由于遗留原因,我必须使用 Oauth 1.0,无法将其升级到 v.2 或任何其他解决方案。
千巷猫影
相关分类