Authenticate as a different user
The X-OpenIDM-RunAs
header lets an administrative user masquerade as a regular user, without needing
that user’s password. To support this header, you must add the runAsProperties
object to the properties
of your authentication module. For example:
"runAsProperties" : {
"adminRoles" : [
"internal/role/openidm-admin"
],
"disallowedRunAsRoles" : [
"internal/role/openidm-admin"
],
"defaultUserRoles" : [
"internal/role/openidm-authorized"
],
"queryId" : "credential-query",
"queryOnResource" : "managed/user",
"propertyMapping" : {
"authenticationId" : "username",
"userRoles" : "authzRoles"
},
"augmentSecurityContext" : {
"type" : "text/javascript",
"source" : "require('auth/customAuthz').setProtectedAttributes(security)"
}
}
This configuration lets a user who authenticates with the openidm-admin
role masquerade as any user
except one with the openidm-admin
role.
If you are adding this configuration to the STATIC_USER
module, and you are using Delegated administration,
you must add an additional propertyMapping
to the properties
of the authentication module. This mapping forces
the privileges to be re-read into the security context when the session JWT is used on subsequent requests. For example:
"propertyMapping" : {
"authenticationId" : "username"
}
The sample authentication.json
file in openidm/samples/example-configurations/conf/runas/
adds the
runAsProperties
object to the STATIC_USER
module. Users or clients who authenticate with this module can
then masquerade as other users.
In the following example, the openidm-admin
user authenticates with the STATIC_USER
module, and can run
REST calls as user bjensen
without that user’s password:
curl \ --header "X-OpenIDM-Username: openidm-admin" \ --header "X-OpenIDM-Password: openidm-admin" \ --header "Accept-API-Version: resource=1.0" \ --header "X-OpenIDM-RunAs: bjensen" \ --request GET \ "http://localhost:8080/openidm/info/login" { "_id": "login", "authenticationId": "bjensen", "authorization": { "userRolesProperty": "authzRoles", "component": "managed/user", "authLogin": false, "adminUser": "openidm-admin", "roles": [ "internal/role/openidm-authorized" ], "ipAddress": "[0:0:0:0:0:0:0:1]", "authenticationId": "openidm-admin", "protectedAttributeList": [ "password" ], "id": "bjensen", "moduleId": "STATIC_USER", "queryId": "credential-query" } }
The authentication output shows that the request was made as user bjensen
but with an adminUser
of
openidm-admin
. This information is also logged in the authentication audit log.
If you were to actually authenticate as user bjensen
, without the runAs
header, the user is authenticated with the MANAGED_USER
authentication module. The output still shows an authenticationId
of bjensen
but there is no reference to an adminUser
:
curl \ --header "X-OpenIDM-Username: bjensen" \ --header "X-OpenIDM-Password: Passw0rd" \ --header "Accept-API-Version: resource=1.0" \ --request GET \ "http://localhost:8080/openidm/info/login" { "_id": "login", "authenticationId": "bjensen", "authorization": { "userRolesProperty": "authzRoles", "component": "managed/user", "authLogin": false, "authenticationIdProperty": "username", "roles": [ "internal/role/openidm-authorized" ], "ipAddress": "[0:0:0:0:0:0:0:1]", "authenticationId": "bjensen", "protectedAttributeList": [ "password" ], "id": "bjensen", "moduleId": "MANAGED_USER", "queryId": "credential-query" } }