16.4. 只读用户属性
存储在 Red Hat Single Sign-On 中的典型用户都有各种与用户配置文件相关的属性。这些属性包括电子邮件、firstName 或 lastname。但是,用户也可能具有属性,它们不是典型配置集数据,而是元数据。元数据属性通常是用户的只读,且典型的用户绝不应该有从 Red Hat Single Sign-On 用户界面或帐户 REST API 更新这些属性的方法。使用 Admin REST API 创建或更新用户时,管理员应当甚至是只读属性。
元数据属性通常是来自这些组的属性:
-
与用户存储供应商相关的各种链接或元数据。例如,如果 LDAP 集成,
LDAP_ID属性包含 LDAP 服务器中的用户的 ID。 -
用户存储调配的元数据。例如,从 LDAP 置备的
createdTimestamp应该始终由用户或管理员只读。 -
与各种验证器相关的元数据。例如,
KERBEROS_PRINCIPAL属性可以包含特定用户的 kerberos 主体名称。同样地属性usercertificate可以包含与 X.509 证书中的数据绑定相关的元数据,这通常在启用了 X.509 证书身份验证时使用。 -
与应用程序/客户端用户识别器相关的元数据。例如,
saml.persistent.name.id.my_app可以包含 SAML NameID,供客户端应用程序my_app用作用户标识符。 - 与授权策略相关的元数据,用于基于属性的访问控制(ABAC)。这些属性的值可用于授权决策。因此,务必要能被用户更新这些属性。
从长期角度来看,Red Hat Single Sign-On 将具有适当的用户配置集 SPI,这将允许对每个用户属性进行精细配置。目前,这个功能还没有完全可用。因此,Red Hat Single Sign-On 具有用户的内部用户属性列表,这些属性是只读的,适用于在服务器级别配置的管理员。
这是只读属性的列表,这些属性由 Red Hat Single Sign-On 默认供应商及功能在内部使用,因此始终是只读的:
-
用户:
KERBEROS_PRINCIPAL,LDAP_ID,LDAP_ENTRY_DN,CREATED_TIMESTAMP,createTimestamp,modifyTimestamp,userCertificate,saml.persistent.name.id.for.*ENABLED,EMAIL_VERIFIED -
管理员:
KERBEROS_PRINCIPAL,LDAP_ID,LDAP_ENTRY_DN,CREATED_TIMESTAMP,createTimestamp,modifyTimestamp
系统管理员可以向此列表中添加其他属性。配置目前在服务器级别可用。您可以将此配置添加到 standalone (-*.xml 文件中到 Red Hat Single Sign-On server subsystem 的配置中:
<spi name="userProfile">
<provider name="legacy-user-profile" enabled="true">
<properties>
<property name="read-only-attributes" value="["foo","bar*"]"/>
<property name="admin-read-only-attributes" value="["foo"]"/>
</properties>
</provider>
</spi>
可使用 JBoss CLI 命令配置相同的方法:
/subsystem=keycloak-server/spi=userProfile/:add
/subsystem=keycloak-server/spi=userProfile/provider=legacy-user-profile/:add(properties={},enabled=true)
/subsystem=keycloak-server/spi=userProfile/provider=legacy-user-profile/:map-put(name=properties,key=read-only-attributes,value=[foo,bar*])
/subsystem=keycloak-server/spi=userProfile/provider=legacy-user-profile/:map-put(name=properties,key=admin-read-only-attributes,value=[foo])
在本例中,用户和管理员无法更新属性 foo。用户无法从 栏 编辑任何属性。因此,如 bar 或 barrier。配置不区分大小写,因此将拒绝 FOO 或 BarRier 等属性。通配符 * 仅在属性名称的末尾被支持,因此管理员可以有效地拒绝以指定字符开头的所有属性。属性中间的 * 被视为常规字符。