我们正在为一个带有 UI Web 模块 (Spring MVC) - 客户端和 RESTful 服务 Web 模块 (CXF) - 服务器的绿地项目设计安全性,将作为单独的 war 文件部署在同一个 Websphere 应用程序服务器中。系统应该使用 Spring Security 保护,针对 LDAP 进行身份验证并针对数据库进行授权。我们一直在寻找在两个应用程序之间共享安全上下文的最佳解决方案,以便用户可以在 Web UI 中进行身份验证并调用其对安全 RESTful 服务的 AJAX 调用。找到的选项:
我们正在寻找更简单的解决方案。我们如何在 2 个应用程序之间传播安全上下文?我们是否应该在 UI Web 应用程序中实现身份验证,然后在数据库中持久化 session ,以便 RESTful 服务查找? CXF可以提供解决方案吗?我们阅读了许多关于生成可以传递的“安全 token ”的线程,但是如何使用 Spring Security 完全做到这一点,它是否足够安全?
期待任何想法或建议。
请您参考如下方法:
您希望能够代表在 UI Web 模块中认证的用户在服务器上执行 REST Web 服务。
您描述的要求称为 SingleSignOn。
最简单的方法是在 REST WS 调用期间传递带有用户名的 HTTP header 。
(我希望您的 REST 客户端允许这样做)。
要以安全的方式执行此操作,请使用以下方法之一:
因此,使用 SpringSecurity 保护两个应用程序对 LDAP 进行身份验证。
在第一个应用程序(Rest Client)中使用常规表单例份验证
在第二个应用程序(Rest Server)中添加您自己的
PreAuthenticatedProcessingFilter
:
http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#d0e6167
已编辑
“身份验证”是验证主体身份的过程。
在我们的例子中,REST 客户端(Spring MVC 应用程序)和 REST 服务器(CXF 应用程序)都根据 LDAP 验证身份。 LDAP “说”OK 或 Not。 LDAP 是一个用户存储库。它是无状态的,不记得以前的状态。它应该保存在应用程序中。
根据我的理解,用户不会直接访问 REST 服务器——用户总是访问 REST 客户端。因此,当用户访问 REST 客户端时,他/她提供用户名和密码,REST 客户端针对 LDAP 进行身份验证。因此,如果 REST 客户端访问 REST 服务器,则用户已通过身份验证,并且 REST 客户端知道他的姓名。
因此,如果请求带有用户 header 名称的 REST 服务器 - REST 服务器肯定知道用户已通过身份验证,并且不应再次针对 LDAP 对其进行身份验证。
(标题应以上述安全方式传递)。
Rest Server 应该使用用户名来访问 LDAP 并在不提供用户密码的情况下收集相关的用户信息(因为用户已经通过身份验证)。