我们正在设计绿色领域项目的安全性,其中包含UI Web模块(Spring MVC) - 客户端和RESTful服务Web模块(CXF) - 服务器,将作为单独的war文件部署在同一个Websphere应用程序中服务器。系统应使用Spring Security进行保护,针对LDAP进行身份验证并针对数据库进行授权。我们一直在寻找在2个应用程序之间共享安全上下文的最佳解决方案,因此用户可以在Web UI中进行身份验证并调用其对安全RESTful服务的AJAX调用。找到的选项:
OAuth:我们的要求似乎有些过分,引入了相当复杂的身份验证流程,据报道存在一些企业集成问题
CAS:相当于设置企业SSO解决方案,超出了我们的参与范围
我们正在寻找一种更简单的解决方案。我们如何在两个应用程序之间传播安全上下文?我们是否应该在UI Web应用程序中实现身份验证,然后在数据库中保留会话,以便RESTful服务进行查找? CXF能提供解决方案吗?我们阅读了很多关于生成可以传递的“安全令牌”的线程,但是如何使用Spring Security完成这项工作呢?它是否足够安全?
期待任何想法或建议。
答案 0 :(得分:1)
您希望能够代表在UI Web模块中进行身份验证的用户在服务器上执行REST Web服务。 您描述的要求称为SingleSignOn。 最简单的方法是在REST WS调用期间使用用户名传递HTTP标头。 (我希望你的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 Client(Spring MVC应用程序)和REST服务器(CXF应用程序)都验证了LDAP的身份。 LDAP“说”好或不好。 LDAP是一个用户存储库。它无国籍,不记得以前的状态。它应该保存在应用程序中。
根据我的理解,用户不会直接访问REST服务器 - 用户总是访问REST客户端。因此,当用户访问REST Client时,他/她提供用户名和密码,REST Client对LDAP进行身份验证。因此,如果REST客户端访问REST服务器,则对用户进行身份验证,并且REST Client知道他的名字。
因此,如果请求来到具有用户标头名称的REST服务器 - REST服务器肯定知道用户已经过身份验证,并且不应再次针对LDAP对其进行身份验证。 (标题应以如上所述的安全方式传递)。 Rest Server应该使用用户名,访问LDAP并收集相关的用户信息,而不提供用户密码(因为用户已经过身份验证)。