Roles (Роли) в Keycloak — это механизм управления доступом пользователей к ресурсам.
Роли позволяют определять, какие действия может выполнять пользователь в системе.
Например, администратор (admin
) может управлять пользователями, а обычный пользователь (user
) может только просматривать контент.
📌 1. Какие бывают типы ролей в Keycloak?
В Keycloak существует два типа ролей:
Тип роли | Описание |
---|---|
Realm Roles | Глобальные роли, применяемые ко всему Realm. |
Client Roles | Специфичные роли для конкретного клиента (приложения). |
🔹 2. Realm Roles (Роли на уровне Realm)
- Realm Role не привязана к конкретному приложению.
- Может быть назначена пользователям или группам.
- Используется для контроля общих прав доступа в рамках Realm.
📌 Примеры Realm Roles:
admin
— Администратор системы.manager
— Менеджер, который управляет заказами.user
— Обычный пользователь.
📌 Как создать Realm Role через Admin Console:
- Перейдите в Realm Settings → Roles.
- Нажмите Create Role.
- Введите имя роли (
admin
). - Нажмите Save.
✅ Теперь можно назначать эту роль пользователям.
📌 Как назначить Realm Role пользователю через API:
curl -X POST "https://keycloak.example.com/auth/admin/realms/myrealm/users/<user_id>/role-mappings/realm" \
-H "Authorization: Bearer <admin_token>" \
-H "Content-Type: application/json" \
-d '[ { "name": "admin" } ]'
✅ Теперь пользователь john_doe
получил роль admin
.
🔹 3. Client Roles (Роли на уровне клиента)
- Применяются только к конкретному клиенту (например,
ecom-api
илиcrm-app
). - Ограничивают доступ внутри конкретного приложения или сервиса.
📌 Примеры Client Roles:
- В клиенте
ecom-api
может быть рольorder_manager
. - В клиенте
crm-app
может быть рольcrm_user
.
📌 Как создать Client Role через Admin Console:
- Перейдите в Clients → Выберите клиент → Roles.
- Нажмите Create Role.
- Введите имя роли (
order_manager
). - Нажмите Save.
📌 Как назначить Client Role пользователю через API:
-H "Authorization: Bearer <admin_token>" \
-H "Content-Type: application/json" \
-d '[ { "name": "admin" } ]'
✅ Теперь пользователь john_doe
имеет роль order_manager
в клиенте ecom-api
.
🔹 4. Различие между Realm Roles и Client Roles
Характеристика | Realm Role | Client Role |
---|---|---|
Где применяется? | На уровне всего Realm | Только в конкретном клиенте (приложении) |
Где создаётся? | В Realm Settings → Roles | В Clients → <Client> → Roles |
Примеры | admin , manager , user | order_manager , crm_user |
🔹 5. Как назначить роли пользователям?
✅ 1. Через Admin Console
- Перейдите в Users → Выберите пользователя → Role Mappings.
- Выберите нужную роль и нажмите Assign.
✅ 2. Через REST API
📌 Назначить пользователю роль admin
(Realm Role):
curl -X POST "https://keycloak.example.com/auth/admin/realms/myrealm/users/<user_id>/role-mappings/realm" \
-H "Authorization: Bearer <admin_token>" \
-H "Content-Type: application/json" \
-d '[ { "name": "admin" } ]'
📌 Назначить пользователю роль order_manager
в клиенте ecom-api
:
curl -X POST "https://keycloak.example.com/auth/admin/realms/myrealm/users/<user_id>/role-mappings/clients/<client_id>" \
-H "Authorization: Bearer <admin_token>" \
-H "Content-Type: application/json" \
-d '[ { "name": "order_manager" } ]'
✅ Теперь пользователь получил нужные роли.
🔹 6. Как проверять роли в приложении?
Когда пользователь аутентифицируется, Keycloak выдаёт JWT-токен, который содержит роли.
Приложение может проверять роли при каждом запросе.
📌 Пример декодированного Access Token (JWT):
{
"realm_access": {
"roles": ["admin", "manager"]
},
"resource_access": {
"ecom-api": {
"roles": ["order_manager"]
}
}
}
📌 Пример проверки ролей в Spring Security (Java)
@PreAuthorize("hasRole('admin')")
@GetMapping("/admin")
public String adminEndpoint() {
return "Доступ только для администраторов";
}
📌 Пример проверки ролей в Express.js (Node.js)
function checkRole(role) {
return (req, res, next) => {
if (!req.user.roles.includes(role)) {
return res.status(403).json({ message: "Доступ запрещён" });
}
next();
};
}
app.get("/admin", checkRole("admin"), (req, res) => {
res.send("Только для администраторов");
});
✅ Результат:
Если у пользователя есть роль admin
, он сможет выполнить запрос.
🎯 Итог
- Realm Roles → Глобальные роли, действующие на весь Realm.
- Client Roles → Роли, специфичные для определённого приложения.
- Роли можно назначать вручную через Admin Console или API.
- Приложения могут проверять роли в JWT-токене.