我对 SOA 相当陌生,因此正在尝试。
目前,对我来说最大的问题是身份验证,我目前的想法涉及以下内容:
客户端向身份验证/用户服务发送某种身份验证消息,该服务查询数据库,如果找到用户并且密码有效,它将使用会话 ID 进行响应,该 ID 将用于所有进一步的请求这个客户。
这对我来说似乎相当不错,但我不知道应该如何处理对其他服务的请求,我想到了三种不同的方法。
每个服务都会询问身份验证服务会话是否有效,如果有效,则用户处于什么角色。身份验证服务会在数据库中查找并做出相应的回复。
身份验证服务将所有会话信息保存在 RAM 中,并且无需数据库往返即可响应请求。
身份验证服务将授权消息发送到 esb,esb 将此授权消息转发到每个服务,并且这些服务会缓存该消息。无需向身份验证服务发出进一步请求。如果用户注销或他的角色发生变化,则会发送另一条消息并由所有服务处理。
我认为第一种方法对身份验证服务/数据库造成了太大的压力,但实施起来却花费最少的精力。
第二个仍然很容易实现,但身份验证服务的压力几乎保持不变。
第三种实现起来稍微复杂一些,但会减少响应时间,因为不会访问身份验证服务。但是,如果会话信息太多,这种方法就会失败,并且很难提供可扩展性。
如果所有服务都是内部的,那么最好的方法应该是这样的,
- 身份验证服务向服务客户端颁发令牌。
- 服务客户端将令牌包含在封装在 WS-Security 或类似内容中的 SOA 消息中。
- 在提供服务之前,服务应使用身份验证服务验证令牌。
对于外部服务,我建议您查看联合解决方案,例如SAML http://en.wikipedia.org/wiki/Security_Assertion_Markup_Language.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)