如果您的REST服务正在访问机密数据,则应该对该服务使用身份验证。如果需要为不同的用户提供不同级别的访问权限,还可以指定端点所需的权限。
本章假设您以前已经生成了REST服务类,如“创建和编辑REST服务”中所述。
6.1 为REST服务设置身份验证
您可以对InterSystems IRIS REST服务使用以下任何形式的身份验证:
- HTTP身份验证头-这是REST服务的推荐身份验证形式。
- Web会话身份验证-用户名和密码在URL中的问号后面指定。
- OAuth 2.0身份验证-请参阅以下小节。
6.1.1 REST应用程序和OAuth 2.0
要通过OAuth 2.0验证REST应用程序,请执行以下所有操作:
-
将包含REST应用程序的资源服务器配置为OAuth 2.0资源服务器。
-
允许%Service.CSP的委派身份验证。
-
确保web应用程序(针对REST应用程序)配置为使用委派身份验证。
-
在%SYS命名空间中创建名为
ZAUTHENTICATE
的例程。InterSystems提供了一个示例例程REST.ZAUTHENTICATE.mac
,您可以复制和修改它。此例程是GitHub上Samples Security示例的一部分(https://github.com/intersystems/Samples-Security)。您可以按照“下载用于InterSystems IRIS的示例”中的描述下载整个示例,但只需在GitHub上打开例程并复制其内容可能会更方便。在例程中,修改applicationName的值,并根据需要进行其他更改。
另请参阅使用OAuth 2.0和OpenID Connect中的“使用InterSystems IRIS Web应用程序作为OAuth 2.0Client”一章中的“可选地为Web客户端定义委派身份验证”。
重要:
如果对HealthShare®使用身份验证,则必须使用InterSystems提供的
ZAUTHENTICATE
例程,并且不能自己编写。
6.2 指定使用REST服务所需的权限
为了指定执行代码或访问数据所需的权限,InterSystems技术使用基于角色的访问控制(RBAC)。有关详细信息,请参阅授权:控制用户访问。
如果需要为不同用户提供不同级别的访问权限,请执行以下操作以指定权限:
-
修改规范类以指定使用REST服务或REST服务中特定端点所需的权限;然后重新编译。特权是一种权限(如读或写),与资源的名称相结合。
参见小节。
-
使用管理门户:
- 定义在规范类中引用的资源。
- 定义提供权限集的角色。例如,角色可以提供对端点的读访问或对不同端点的写访问。一个角色可以包含多组权限。
- 将用户置于其任务所需的所有角色中。
此外,您可以使用%CSP.REST
的SECURITYRESOURCE
参数来执行授权。
6.2.1 指定权限
您可以为整个REST服务指定特权列表,也可以为每个端点指定特权列表。为此:
-
要指定访问服务所需的权限,请编辑规范类中的OpenAPIXData块。对于信息对象,添加一个名为x-ISC_RequiredResource的新属性,其值是以逗号分隔的已定义资源及其访问模式(资源:模式)的列表,访问REST服务的任何端点都需要该列表。
以下是一个示例:
"swagger":"2.0", "info":{ "version":"1.0.0", "title":"Swagger Petstore", "description":"A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification", "termsOfService":"http://swagger.io/terms/", "x-ISC_RequiredResource":["resource1:read","resource2:read","resource3:read"], "contact":{ "name":"Swagger API Team" }, ...
-
要指定访问特定端点所需的权限,请将x-ISC_RequiredResource属性添加到定义该端点的操作对象,如下例所示:
"post":{ "description":"Creates a new pet in the store. Duplicates are allowed", "operationId":"addPet", "x-ISC_RequiredResource":["resource1:read","resource2:read","resource3:read"], "produces":[ "application/json" ], ...
-
编译规范类。此操作重新生成调度类。
6.2.2 使用SECURITYRESOURCE参数
作为一个附加的授权工具,%CSP.REST的子类分派类具有SECURITYRESOURCE参数。SECURITYRESOURCE的值要么是资源及其权限,要么只是资源(在这种情况下,相关权限为Use)。系统检查用户是否对与SECURITYRESOURCE关联的资源具有所需的权限。
注:
如果分派类为SECURITYRESOURCE指定了一个值,并且CSPSystem用户没有足够的特权,那么这可能会导致登录尝试失败时出现意外的HTTP错误代码。为了防止这种情况发生,InterSystems建议您将指定资源的权限授予CSPSystem用户。