在 IFS Cloud 中创建 OAuth2 技术账户看起来很简单:生成 Client ID 和 Client Secret,分配几个 Permission Sets,似乎就完成了。实际上,只要该账户需要访问 HCM 数据,多个身份层就会叠加在一起:IAM Client、Service Account、IFS Service User 和 Person。我们的 UAT 环境刷新之后,这条身份链变得不一致,IFS 甚至在评估权限之前就拒绝了该账户。下面是最终在我的 IFS Cloud 25R2 环境中成功运行的配置。
Login.FUSRNULL 看起来像缺少权限,但问题其实发生在更前面的身份链中。
这是实战经验,不是适用于所有环境的规则
本文描述的是一套在 IFS Cloud 25R2 环境中真实使用过的配置。屏幕名称、导航路径和 HCM 机制可能会因版本、已安装组件、管理员角色和定制内容而不同。并不是所有集成都必须创建 Person:在我的场景中,之所以需要 Person,是因为该账户必须获得特定 HCM 数据范围的访问权限。
01真正的问题:多条身份链同时存在
我的需求其实非常常见:创建一个可供中间件使用的技术账户,获取 Client ID 和 Client Secret,通过 OAuth2 Client Credentials 流程申请 token,然后调用 HCM 模块所需的 IFS REST API。
真正的陷阱,是以为一个“API 账户”对象能够承担所有这些职责。实际上,IFS 将它们拆分为多个层级:
外部应用
│
▼
IAM Client
│
▼
IAM Service Account
│
▼
IFS Service User
│
├── Companies
├── Permission Sets
│
▼
Person
│
▼
HCM 数据范围
每一层回答的问题都不同:
- 谁来申请 token? IAM Client。
- 哪一个技术身份承载 token? IAM Service Account。
- 哪一个 IFS 用户执行 API 调用? IFS Service User。
- 允许调用哪些功能和 projection? Permission Sets。
- 可以看到哪些 Companies 和人力资源数据? Company 访问权限以及与 Person 关联的 HCM 数据范围。
最需要记住的一句话
IAM Client ≠ Service Account ≠ IFS Service User ≠ Person。它们的名称可能相似,但既不是同一个对象,也不属于同一个授权层。
02为什么 UAT 刷新让问题变得更复杂
在我的场景中,问题出现在 UAT 环境从生产环境刷新之后。该 API 账户之前存在于 UAT,但在作为克隆源的生产环境中并不存在。
刷新完成后,一些组件仍然存在,另一些组件只被部分重建,而 IAM 与 IFS 用户之间的关联已经不再一致。
IAM Client 存在
+
IFS 用户存在或只被部分重建
+
Directory ID 缺失、错误或关联到错误对象
=
无法获取 token 或无法运行应用
API 返回的是一个由通用代码 DB_ACCESS_ERROR 包装的错误,其中包含以下详细信息:
ORA-20105: Login.FUSRNULL:
The directory id SERVICE-ACCOUNT-... is not allowed to run the application.
很多人的第一反应是继续添加 Permission Sets。但在这个具体场景中,这样做没有任何作用:IFS 还没有进入功能权限评估阶段。它首先就无法把 IAM 身份正确解析为 IFS 应用用户。
不要被最外层错误信息误导
总体错误信息可能让人以为是数据库或授权问题。实际上,Login.FUSRNULL 的详细信息说明,排查应该从身份链开始:Service Account User、Directory ID 和 IFS Service User。
03必须区分的四个对象
| 对象 | 作用 | 它不能替代什么 |
|---|---|---|
| IAM Client | 代表申请 OAuth2 token 的外部应用。 | 它本身不承载 Companies、Permission Sets 或 HCM 数据范围。 |
| IAM Service Account | 在 IAM Client 上启用 Service Accounts 后创建的技术身份。 | 它不能替代 Users 页面中可见的应用用户。 |
| IFS Service User | 用于分配 Permission Sets、Companies 和其他 IFS 授权的应用用户。 | 它不会自动提供 Client ID 和 Client Secret。 |
| Person | 某些 HCM 数据和组织访问控制所使用的 Person 对象。 | 它不能替代 IFS 用户及其 Permission Sets。 |
04两个创建向导带来的陷阱
IFS 提供两条创建路径,而每一条单独看起来都几乎够用。
路径 A:从 Users 开始
在 IFS 用户页面中,可以创建类型为 Service User 的用户,并为其关联一个 Person。这对于 HCM 很方便,但不会自动创建 IAM Client、Client ID 和 Client Secret。
路径 B:让 IAM 自动创建用户
在 IAM Clients 中,自动创建选项可以生成关联的 Service User。对于许多常规集成来说很方便,但在我的环境中,自动生成的用户没有 HCM 数据范围所需的 Person。
从 Users 创建
→ IFS Service User + Person
→ 没有 Client ID / Client Secret
从 IAM Client 自动创建
→ IAM Client + Service Account + IFS Service User
→ 在我的场景中没有 Person
因此,最终采用的方法是有意将这两个操作拆开:
最终成功的方法
先创建不自动创建 Service User 的 IAM Client,获取准确的 Service Account User 值,然后手动创建带 Person 的 IFS Service User。两者之间通过 Directory ID 建立技术关联。
05能够正常工作的目标架构
IAM Client: IFS_BLUEWAY
│
├── Client ID
├── Client Secret
└── Service Accounts = Yes
│
▼
IAM Service Account
service-account-ifs_blueway
│
│ 将该值复制到 Directory ID
▼
IFS Service User: IFS_BLUEWAY
│
├── User Type = Service User
├── Companies
├── Permission Sets
└── Create Person = Yes
│
▼
Person: IFS_BLUEWAY
│
▼
HCM Organization Access
必须复制准确值
不要根据客户端名称自行拼接 Directory ID。请直接复制 IAM 实际创建的值,不要修改环境中显示的连字符、前缀或大小写。
06步骤 1:创建 IAM Client
在 IFS Cloud 25R2 中打开:
Solution Manager
→ Users and Permissions
→ Identity and Access Manager
→ IAM Clients
创建一个专用于该集成的客户端,例如:
IFS_BLUEWAY
对于服务器到服务器的场景,我使用的配置如下:
| 界面参数 | 值 | 原因 |
|---|---|---|
Enabled |
Yes | 客户端必须处于启用状态。 |
Public Client |
No | 中间件属于能够安全保存 secret 的 confidential client。 |
Service Accounts |
Yes | 启用 Client Credentials 所使用的技术身份。 |
Create IFS Service User |
No | 之后可以手动创建带 Person 的 Service User。 |
IFS 随后会创建一个类似以下内容的 Service Account 身份:
service-account-ifs_blueway
需要保存三项信息:Client ID、Client Secret,以及准确的 Service Account User 值。
Client Secret 是生产级敏感信息
不要把它放进截图、工单、日志、受版本控制的配置文件或共享的 Postman collection。应将它保存到 secret vault,或使用中间件提供的安全凭据管理机制。
07步骤 2:创建 IFS Service User 及其 Person
然后打开:
Solution Manager
→ Users and Permissions
→ Users
手动创建技术用户。例如:
Identity : IFS_BLUEWAY
User Type : Service User
Directory ID : service-account-ifs_blueway
Create Person : Yes
最关键的字段是 Directory ID。它必须包含 IAM Client 创建的准确 Service Account User 值。
IFS Identity 的名称可以保持便于管理员阅读,但真正建立技术关联的是 Directory ID:
OAuth2 token
│
▼
IAM Service Account
│
│ 通过 Directory ID 解析
▼
IFS Service User
│
▼
允许的权限与数据
还需要确认该用户处于启用状态、被允许运行应用,并且类型确实为 Service User。
08为什么 HCM 可能需要 Person
中间件当然不是真实的人。但在 IFS 中,一些 HCM 授权机制依赖 Person 对象以及它与组织范围之间的关联。
因此必须区分两类控制:
| 控制类型 | 它回答的问题 | 示例 |
|---|---|---|
| 功能权限 | 该用户可以调用什么? | 访问某个 REST projection 或 IFS 功能。 |
| HCM 数据授权 | 该用户可以读取或操作哪些数据? | 可访问的组织范围、员工或组织单元。 |
因此,即使账户拥有所需的 Permission Sets,如果关联 Person 没有正确的数据范围,某些 HCM API 仍可能返回错误或空结果。
09步骤 3:分配 Companies
根据环境配置,Company 访问权限可以从以下位置管理:
Accounting Rules
→ User Related Data
→ Users per Company
将技术账户添加到中间件需要读取或处理数据的每一个 Company。不要默认授予所有 Companies,仍然应该遵循最小权限原则。
10步骤 4:分配 Permission Sets
接下来,为中间件实际使用的 REST projections 和功能分配所需的 Permission Sets。
Permission Set 不等于无限制访问 HCM
Permission Sets 用于启用功能和 projections。HCM 控制仍然可能根据 Person、组织、Company 和业务上下文过滤数据。
为了更容易诊断问题,应从测试 projection 所需的最小 Permission Sets 开始,然后按功能逐步添加权限。直接分配一个非常宽泛的权限配置会掩盖真正的问题,并增加安全风险。
11步骤 5:分配 HCM 数据范围
组织结构可以从以下位置访问:
Human Capital Management
→ HCM Services
→ Organization Management
→ Graphical Organization Structure
检查技术账户对应的 Person 必须访问哪些范围。正确的设置取决于实际需求:整个组织、部分组织单元,或更受限制的范围。
完整链条如下:
IAM Client
│
▼
IAM Service Account
│
▼
IFS Service User
├── Companies
├── Permission Sets
│
▼
Person
│
▼
HCM Organization Access
12逐层测试 OAuth2 和 API
完成配置后,中间件即可使用 OAuth2 Client Credentials 流程。
Client ID + Client Secret
│
▼
IFS OAuth2 endpoint
│
▼
Access Token
│
▼
Authorization: Bearer <token>
│
▼
IFS REST projection
为了避免把多个问题混在一起,建议按照以下顺序测试:
- 使用 Client ID 和 Client Secret 获取 token。
- 调用一个简单 projection,该 projection 只需要少量权限。
- 使用非 HCM 数据测试 Company 访问权限。
- 测试目标 HCM projection。
- 将预期结果与 Person 的数据范围进行比较。
以下是通用示例,需要替换为当前环境真实的 OAuth2 endpoint:
curl -X POST "<IFS_TOKEN_ENDPOINT>" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=<CLIENT_ID>" \
-d "client_secret=<CLIENT_SECRET>"
不要把完整命令写入日志
在运维脚本中,secret 应来自受保护的变量或凭据库。还应避免它出现在 shell history 中。
13错误诊断矩阵
下表是一套实用诊断方法,并不是 IFS 官方提供的完整错误列表。
| 症状 | 首先检查的层级 | 建议检查内容 |
|---|---|---|
| 无法获取 token | IAM Client 和 OAuth2 | 客户端是否启用、secret 是否有效、grant 是否允许、endpoint 和环境是否正确。 |
Login.FUSRNULL 或 Directory ID 未授权 |
IAM 到 IFS User 的关联 | 准确的 Service Account User、Directory ID、用户状态、Service User 类型以及是否存在重复值。 |
| token 有效,但 projection 返回 401/403 | Permission Sets 和 projection | projection 权限、目标 IFS 用户以及 Permission Set 是否启用。 |
| API 有响应,但缺少部分 Companies | Users per Company | 账户已分配的 Companies 和预期的 Company 上下文。 |
| HCM API 返回很少数据或没有数据 | Person 和 HCM 范围 | 是否创建 Person、用户与 Person 的关联、组织范围和 HCM 授权。 |
| 账户在 refresh 前可以正常工作 | 跨环境一致性 | 是否重新创建 IAM Client、Service Account User、Directory ID、secret、Person 和权限。 |
FUSRNULL 错误:优先检查项
IAM Service Account User
=
IFS Service User 的 Directory ID
然后继续确认:
- Service User 处于启用状态。
- 其类型为
Service User。 - 该用户被允许运行 IFS 应用。
- Directory ID 与 IAM 身份完全一致。
- 没有其他用户使用相同的 Directory ID。
- 测试使用的是正确环境以及正确的 Client ID。
14环境克隆后的检查清单
无论是从 PROD 克隆到 UAT、刷新 TEST,还是执行其他环境替换操作,用户在界面中仍然可见,都不能证明整条身份链仍然一致。
- IAM Client:它是否存在于目标环境中,并处于启用状态?
- Client ID:中间件使用的是否是目标环境对应的 Client ID?
- Client Secret:它是否仍然有效,并保存在正确位置?
- Service Account User:IAM 实际创建的准确值是什么?
- IFS Service User:它是否存在、处于启用状态,并且类型正确?
- Directory ID:它是否与 Service Account User 完全一致?
- Person:它是否存在,并关联到正确用户?
- Companies:是否已分配所需 Companies?
- Permission Sets:目标 projections 是否已授权?
- HCM Access:组织范围是否仍然存在?
尽可能自动化这份检查清单
对于关键集成,应为每个环境维护一份运维记录,其中包含对象名称、健康检查、使用的 projections 和重建步骤。当然,secret 本身绝不能以明文形式记录。
15技术账户的安全与运维
还应补充以下通用最佳实践:
- 每个集成、每个环境使用独立客户端:不要让多个中间件共用同一个 Client ID,也不要让 PROD 与 UAT 共用。
- 最小权限:只分配必要的 Companies、projections 和 HCM 数据范围。
- Secret 轮换:记录凭据更新流程以及中间件更新步骤。
- 可追溯性:使用可以在日志和审计中明确识别的技术名称。
- 健康检查:定期验证 token 获取,并调用一个无破坏性的 projection。
- 禁止交互式登录:用于集成的 Service User 不应变成通用人工账户。
- 可控撤销:在停用客户端或 Service User 之前,先明确哪些数据流会受到影响。
HCM 账户尤其敏感
人力资源数据可能包含个人信息和机密信息。拥有 HCM 权限的技术账户必须受到监控,只能访问必要数据,并且只能由预定的中间件使用。
16最终配置与快速检查清单
在我的环境中,最终可用的配置如下:
IAM Client: IFS_BLUEWAY
├── Enabled = Yes
├── Public Client = No
├── Service Accounts = Yes
├── Create IFS Service User = No
├── Client ID
└── Client Secret
│
▼
IAM Service Account User
service-account-ifs_blueway
│
│ Directory ID
▼
IFS Service User: IFS_BLUEWAY
├── User Type = Service User
├── Active
├── Companies
├── Permission Sets
└── Person 已创建
│
▼
Person: IFS_BLUEWAY
└── HCM 授权
需要记住的创建顺序:
1. 创建 IAM Client。
2. 启用 Service Accounts。
3. 不要让系统自动创建 Service User。
4. 复制准确的 Service Account User 值。
5. 手动创建 IFS Service User。
6. 将 Service Account User 用作 Directory ID。
7. 创建关联的 Person。
8. 分配 Companies。
9. 分配 Permission Sets。
10. 分配 HCM 数据范围。
11. 先测试 token,再逐层测试 API。
重点总结
- IAM Client、IAM Service Account、IFS Service User 和 Person 是不同对象。
- Directory ID 是 IAM 身份与 IFS 应用用户之间的关键关联。
- 在这个 HCM 场景中,必须通过两个独立操作手动创建 IAM Client 和 Service User。
Create IFS Service User必须保持为 No,这样之后才能创建 Person。- Permission Sets 用于授权功能,但它本身不能保证可以访问 HCM 数据。
- 遇到
Login.FUSRNULL时,首先应该检查 Directory ID 和用户解析过程。 - 环境克隆后,必须重新检查整条 IAM → IFS User → Person 链。
- Client Secret 必须像密码一样保护,并且按环境隔离。
本文适用范围
本文是基于 IFS Cloud 25R2 的技术实战经验,并非 IFS 官方文档。不同安装环境中的页面、选项和授权规则可能会发生变化或存在差异。
IFS_BLUEWAY、service-account-ifs_blueway、Client ID 和 endpoint 都是示例。绝不要在文章、Git 仓库、工单或截图中包含真实的 Client Secret。




评论
0 条评论暂无已发布评论,欢迎率先参与。