我正在开发一套Web服务,需要基于角色的访问控制.
使用metro – SOAP,简单的java没有EJB.
>我想一次验证用户,使用用户名和
密码,与数据库进行匹配.在随后的电话中.
>我想使用某种会话管理.可能是一些
会话ID,在登录时检索到客户端,全部呈现
调用.
至今:
>阅读 authentication using a database – 但我想要应用程序级验证;
>阅读application authentication with jax-ws – 但我不想每次做认证机制;
>我想我可以使用一个SOAP处理程序来拦截所有的消息,并且在执行器中执行授权控制,使用一些会话标识符令牌,该消息可以与保存在数据库中的标识符进行匹配,在登录Web方法.
编辑:
我还有一些问题:
>如何知道被调用的Web方法的名称?
>我应该使用什么样的令牌?
>如何在通话之间传递这个令牌?
编辑2
因为@ ag112答案:
我在使用Glassfish.
我使用WS-Policy和WS-Security对邮件进行加密和签名.使用相互证书身份验证.我想补充这种消息级别的应用程序之间的安全性,用户的认证和授权也在消息级别.
我只是开发服务,我几乎不知道客户端,只是他们可以用不同的语言创建.
在这一点上,我认为最重要的是做我需要做的,以验证和验证用户,我最容易的方式来实现客户端应用程序.
解决方法
针对您的问题的精确解决方案取决于您期望的Web服务客户端的类型,您是否可以控制Web服务客户端系统,应用程序服务器等…..但假设您没有对Web服务客户端的任何控制,你只是一个通过HTTP传输的SOAP消息,这里是可能的解决方案.
你当然可以执行会话管理和消息级别或传输级别的认证.这意味着您可以在SOAP消息中拥有会话令牌和身份验证令牌信息,也可以使用标准HTTP会话和HTTP身份验证机制.
当然,如果传输层是HTTP,传输层解决方案要简单得多,行业范围更广泛.对于消息级别,可以使用ws-security等ws规范.
您的每个Web服务请求都是由唯一HTTP URI标识的简单HTTP GET / POST.
通常在jax-ws地铁环境中,WSServlet是用于任何Web服务调用的入口servlet,并且最终将调用委托给正确的服务提供者实现类.由于您的应用程序将部署在Web服务器中,您可以利用J2ee Web容器提供的所有会话和身份验证功能.
由于您正在寻找基于角色的访问控制,因此我将使用标准的< web-resource-collection>在web.xml中指定您希望在特定HTTP URI的情况下使用哪个角色.您可以使用标准的JAAS登录模块,该模块可以进行身份验证,并使用角色填充JAAS主题.如果SOAP XML中提供了用户名/密码,则JAAS登录模块还可以搜索/解析SOAP XML以检索这些信息. JAAS / app服务器将自动创建auth令牌并将其存储为cookie,以便每个后续请求不需要再次通过身份验证过程.这就是所有的J2ee标准.你可以在互联网上找到很多帮助.请让我知道您的应用服务器,以便我可以为您提供更多详细信息.
如果您仍然想使用SOAP消息级会话管理,则认证&授权过程,然后为您提供更多详细信息,可以了解有关客户端的更多详细信息.
EDIT1:
根据您的进一步投入,这里是我更多的想法:
消息安全性即加密和签名需要发生每个消息在服务器和客户端之间传播.作为消息身份验证 – 您打算做一次,并向客户端发送会话令牌/身份验证令牌用于后续调用.
问题仍然存在:如果在第一次身份验证的SOAP响应中放置唯一会话标识符,您希望客户端解析SOAP响应XML,并确保客户端每次在随后的SOAP请求中向您发送会话标识符.
要么
您希望将会话管理保持为透明的客户端,并且客户端需要首先发送用户名/密码令牌,后续的呼叫不需要任何用户名/密码令牌.在这种情况下,您将需要依靠基于传输的会话管理. HTTP Cookie
现在最适合你的情况取决于你的用例.你能告诉我预期的用例流程是什么?另一个系统(Web服务客户端)如何对系统进行多个服务调用?是另一个系统用户驱动/一些后台进程?什么是确切的需要,您只想要第一个服务呼叫通过身份验证过程而不是后续呼叫?
PS:Glassfish服务器提供了一种配置消息认证提供程序的方式,可自动启用/禁用消息级认证.
EDIT2:
我明白你不想在客户端应用程序中存储用户凭据,Web服务器需要这些用户凭据.
OAuth是开放的标准协议,允许站点A访问站点B上的用户私有数据.最终的想法是站点A获得具有特定到期时间的认证令牌.因此,从用户凭据或jsession id加密的令牌可以帮助您避免重新认证.您只需要决定在客户端应用程序方面保持令牌的位置
如果传输是HTTP协议,则可以将令牌保存为cookie.
说过,每次传递用户凭据每次似乎都比较容易和直接.