Вот JSON с описанием роли:
{
"id": "<role-id>",
"name": "<role-name>",
"composite": true,
"composites": {
"client": {
"realm-management": [
"realm-admin",
"manage-identity-providers",
"view-users",
"view-clients",
"query-users",
"manage-authorization",
"view-events",
"manage-users",
"manage-events",
"view-identity-providers",
"view-authorization",
"query-groups",
"query-realms",
"query-clients",
"impersonation",
"create-client",
"view-realm",
"manage-clients",
"manage-realm"
]
}
},
"clientRole": false,
"containerId": "<realm-id>",
"attributes": {}
}
Несмотря на то, что он создан в Keycloak, когда я запускаю kcadm.sh get roles/<role-name>
, он говорит, что это не композит. Копнув немного глубже, я нашел следующую ошибку в логах Keycloak:
ERROR [org.keycloak.services.error.KeycloakErrorHandler] (default task-15) Uncaught server error: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `org.keycloak.representations.idm.RoleRepresentation$Composites` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('client')
Так что, думаю, проблема кроется где-то в поле «композиты». Файл, который я показал, я получаю через экспорт, поэтому он должен быть действительным.
UPD Для создания роли я использую команду kcadm.sh create roles -s name=<role-name> -r <realm-name> -f role.json
Вы можете сделать это, сначала создав .json
(давайте назовем role.json
) со следующим содержимым:
{
"roles": {
"realm": [
{
"name": "<ROLE_NAME>",
"composite": true,
"composites": {
"client": {
"realm-management": [
"realm-admin",
"view-events",
"manage-clients",
"create-client",
"manage-realm",
"view-users",
"manage-identity-providers",
"manage-users",
"query-users",
"view-clients",
"query-realms",
"view-authorization",
"view-realm",
"query-groups",
"impersonation",
"manage-events",
"manage-authorization",
"query-clients",
"view-identity-providers"
]
}
},
"clientRole": false,
"containerId": "Realm",
"attributes": {}
}
]
}
}
а потом звони ./kcadm.sh create partialImport -r <REALM_NAME> -s ifResourceExists=FAIL -o -f role.json