第四种,如上示意图所示,使用SAML协议来对用户请求进行操作鉴权。它是一个基于XML的标准,用于在不同的安全域(security domain)之间交换认证和授权数据。在SAML标准定义了身份提供者(identity provider)和服务提供者(service provider),这两者构成了前面所说的不同的安全域。
以上图Google提供的Apps SSO的机制,简单介绍下SAML鉴权的交互方式:
用户请求访问自建的google application
当前application 生成一个 SAML 身份验证请求。SAML 请求将进行编码并嵌入到SSO 服务的网址中。
当前application将重定向发送到用户的浏览器。重定向网址包含应向SSO 服务提交的编码 SAML 身份验证请求。
SSO(统一认证中心或叫Identity Provider)解码 SAML 请求,并提取当前application的 ACS(声明客户服务)网址以及用户的目标网址(RelayState 参数)。然后,统一认证中心对用户进行身份验证。
统一认证中心生成一个 SAML 响应,其中包含经过验证的用户的用户名。按照 SAML 2.0 规范,此响应将使用统一认证中心的 DSA/RSA 公钥和私钥进行数字签名。
统一认证中心对 SAML 响应和 RelayState 参数进行编码,并将该信息返回到用户的浏览器。统一认证中心提供了一种机制,以便浏览器可以将该信息转发到当前application ACS。
当前application使用统一认证中心的公钥验证 SAML 响应。如果成功验证该响应,ACS 则会将用户重定向到目标网址。
用户将重定向到目标网址并登录到当前application。
目前SAML在业界也有相当的使用度,包括IBM Weblogic等产品。
第四种方案的特点有:
由Identity Provider提供可信的签名声明
服务的访问安全由可信的Identity Provider提供
小结下使用第四种方案的好处:标准的可信访问模型
同时,小结下使用这种方案需要注意的地方:
基于XML协议,传输相对复杂
对非浏览器客户端适配不方便
四、Spring Cloud Security解决方案
Spring Cloud Security特点有:
基于OAuth2 和OpenID协议的可配置的SSO登录机制
基于tokens保障资源访问安全
引入UAA鉴权服务,UAA是一个Web服务,用于管理账户、Oauth2客户端和用户用于鉴权的问题令牌(Issue Token)。UAA实现了Oauth2授权框架和基于JWT(JSON web tokens)的问题令牌。
下面简单介绍下UAA,事实上,它是由CloudFoundry发起的,也是CloudFoundry平台的身份管理服务( https://docs.cloudfoundry.org/ ... .html )。
主要功能是基于OAuth2,当用户访问客户端应用时,生成并发放token给目标客户端。
UAA认证服务包含如下几个方面的内容:
认证对象。如用户、客户端以及目标资源服务器
认证类型。主要有授权码模式、密码模式以及客户端模式
认证范围,即认证权限,并作为一个命名的参数附加到AccessToken上。
接下来,结合实例,一起来看下UAA在Spring Cloud中的实践。
如图所示,这是一个简单的基于Spring Cloud微服务架构的例子,它的主要组件有:
Eureka组件提供服务发现功能
独立的Config组件提供类似配置中心的服务,持久化层可以是文件系统,也可是git repository
Auth组件提供基于UAA的鉴权服务
Account组件保存用户的业务信息
其他组件不一一介绍了
这里主要讲Auth组件和Account组件是如何基于UAA服务进行认证和授权。
图一为Auth组件业务代码中定义了不同客户端的认证类型和认证范围,其中:
浏览器端的认证类型是password,认证范围是ui
account组件端的认证类型是client_credentials,认证范围是server
图二为config组件(配置中心)定义的请求路由的规则,其中: