Keycloak Producer Operations
The Keycloak producer supports administrative operations on Keycloak instances via the Admin API.
For an overview of the Keycloak component, see Keycloak Component .
Configuration
The Keycloak component supports four authentication methods:
-
Access Token (Bearer Token) - Use a pre-obtained access token
-
Refresh Token - Maintain long-running sessions with automatic token refresh
-
Username/Password - Resource Owner Password Credentials flow
-
Client Credentials - Service-to-service authentication
Access Token Authentication
Use this when you have a pre-obtained access token from an external authentication system:
-
Java
// Configure Keycloak component with access token
KeycloakComponent keycloak = context.getComponent("keycloak", KeycloakComponent.class);
KeycloakConfiguration config = new KeycloakConfiguration();
config.setServerUrl("http://localhost:8080");
config.setRealm("master");
config.setAccessToken("eyJhbGciOiJSUzI1NiIsInR5cC...");
keycloak.setConfiguration(config);
Refresh Token Authentication
Use this for long-running sessions that need to maintain authentication without storing credentials. The refresh token will be used to automatically obtain new access tokens when needed:
-
Java
// Configure Keycloak component with refresh token
KeycloakComponent keycloak = context.getComponent("keycloak", KeycloakComponent.class);
KeycloakConfiguration config = new KeycloakConfiguration();
config.setServerUrl("http://localhost:8080");
config.setRealm("master");
config.setClientId("my-client");
config.setRefreshToken("eyJhbGciOiJIUzI1NiIsInR5cCIgOi...");
// Optional: set client secret for confidential clients
config.setClientSecret("my-client-secret");
keycloak.setConfiguration(config);
Refresh token authentication requires a
clientId
. The
clientSecret
is optional and should be provided only if your client is configured as confidential in Keycloak.
|
Username/Password Authentication
Use this for admin user authentication:
-
Java
// Configure Keycloak component
KeycloakComponent keycloak = context.getComponent("keycloak", KeycloakComponent.class);
KeycloakConfiguration config = new KeycloakConfiguration();
config.setServerUrl("http://localhost:8080");
config.setRealm("master");
config.setUsername("admin");
config.setPassword("admin");
keycloak.setConfiguration(config);
Client Credentials Authentication
Use this for service-to-service authentication:
-
Java
// Configure Keycloak component with client credentials
KeycloakComponent keycloak = context.getComponent("keycloak", KeycloakComponent.class);
KeycloakConfiguration config = new KeycloakConfiguration();
config.setServerUrl("http://localhost:8080");
config.setRealm("master");
config.setClientId("my-service-client");
config.setClientSecret("my-client-secret");
keycloak.setConfiguration(config);
Supported Operations
The component supports the following operations:
-
Realm Management :
createRealm,getRealm,updateRealm,deleteRealm -
User Management :
createUser,getUser,updateUser,listUsers,searchUsers,deleteUser -
User Attributes :
getUserAttributes,setUserAttribute,deleteUserAttribute -
User Credentials :
getUserCredentials,deleteUserCredential -
User Actions :
sendVerifyEmail,sendPasswordResetEmail,addRequiredAction,removeRequiredAction,executeActionsEmail -
Role Management :
createRole,getRole,updateRole,listRoles,deleteRole,assignRoleToUser,removeRoleFromUser,getUserRoles -
Group Management :
createGroup,getGroup,updateGroup,listGroups,deleteGroup,addUserToGroup,removeUserFromGroup,listUserGroups -
Client Management :
createClient,getClient,updateClient,listClients,deleteClient -
Client Secret Management :
getClientSecret,regenerateClientSecret -
Client Role Management :
createClientRole,getClientRole,updateClientRole,listClientRoles,deleteClientRole,assignClientRoleToUser,removeClientRoleFromUser -
Password Management :
resetUserPassword -
Session Management :
listUserSessions,logoutUser,logoutAllUsers -
Token Management :
revokeAccessToken,revokeRefreshToken,introspectToken,pushNotBefore -
Client Scope Management :
createClientScope,getClientScope,updateClientScope,listClientScopes,deleteClientScope -
Identity Provider Management :
createIdentityProvider,getIdentityProvider,updateIdentityProvider,listIdentityProviders,deleteIdentityProvider -
Authorization Services :
createResource,getResource,updateResource,listResources,deleteResource,createResourcePolicy,getResourcePolicy,updateResourcePolicy,listResourcePolicies,deleteResourcePolicy,createResourcePermission,getResourcePermission,updateResourcePermission,listResourcePermissions,deleteResourcePermission,evaluatePermission -
Organization Management (Keycloak 26+):
createOrganization,getOrganization,updateOrganization,listOrganizations,searchOrganizations,deleteOrganization,addOrganizationMember,removeOrganizationMember,listOrganizationMembers,linkOrganizationIdentityProvider,unlinkOrganizationIdentityProvider,listOrganizationIdentityProviders
Usage Pattern
All producer operations follow the same pattern: set the operation name in the URI and pass parameters via message headers.
template.sendBodyAndHeaders("keycloak:admin?operation=<operationName>", null, headers);
User Operations
-
Java
// Create a new user
Map<String, Object> headers = new HashMap<>();
headers.put("CamelKeycloakRealmName", "my-realm");
headers.put("CamelKeycloakUsername", "john.doe");
headers.put("CamelKeycloakUserEmail", "john.doe@example.com");
headers.put("CamelKeycloakUserFirstName", "John");
headers.put("CamelKeycloakUserLastName", "Doe");
template.sendBodyAndHeaders("keycloak:admin?operation=createUser", null, headers);
// Set user password
Map<String, Object> passwordHeaders = new HashMap<>();
passwordHeaders.put("CamelKeycloakRealmName", "my-realm");
passwordHeaders.put("CamelKeycloakUsername", "john.doe");
passwordHeaders.put("CamelKeycloakUserPassword", "secure-password");
passwordHeaders.put("CamelKeycloakUserPasswordTemporary", false);
template.sendBodyAndHeaders("keycloak:admin?operation=setUserPassword", null, passwordHeaders);
// List all users in realm
template.sendBodyAndHeader("keycloak:admin?operation=listUsers", null,
"CamelKeycloakRealmName", "my-realm");
// Delete a user
Map<String, Object> deleteHeaders = new HashMap<>();
deleteHeaders.put("CamelKeycloakRealmName", "my-realm");
deleteHeaders.put("CamelKeycloakUsername", "john.doe");
template.sendBodyAndHeaders("keycloak:admin?operation=deleteUser", null, deleteHeaders);
Role Operations
-
Java
-
YAML
// Create a new role
Map<String, Object> roleHeaders = new HashMap<>();
roleHeaders.put("CamelKeycloakRealmName", "my-realm");
roleHeaders.put("CamelKeycloakRoleName", "manager");
roleHeaders.put("CamelKeycloakRoleDescription", "Manager role with elevated privileges");
template.sendBodyAndHeaders("keycloak:admin?operation=createRole", null, roleHeaders);
// Get role information
Map<String, Object> getRoleHeaders = new HashMap<>();
getRoleHeaders.put("CamelKeycloakRealmName", "my-realm");
getRoleHeaders.put("CamelKeycloakRoleName", "manager");
template.sendBodyAndHeaders("keycloak:admin?operation=getRole", null, getRoleHeaders);
// Assign role to user
Map<String, Object> assignHeaders = new HashMap<>();
assignHeaders.put("CamelKeycloakRealmName", "my-realm");
assignHeaders.put("CamelKeycloakUsername", "john.doe");
assignHeaders.put("CamelKeycloakRoleName", "manager");
template.sendBodyAndHeaders("keycloak:admin?operation=assignRoleToUser", null, assignHeaders);
// Delete a role
Map<String, Object> deleteRoleHeaders = new HashMap<>();
deleteRoleHeaders.put("CamelKeycloakRealmName", "my-realm");
deleteRoleHeaders.put("CamelKeycloakRoleName", "old-role");
template.sendBodyAndHeaders("keycloak:admin?operation=deleteRole", null, deleteRoleHeaders);
# Create role route
- route:
from:
uri: direct:create-role
steps:
- setHeader:
name: CamelKeycloakRealmName
constant: "my-realm"
- setHeader:
name: CamelKeycloakRoleName
expression:
simple:
expression: "${body[roleName]}"
- setHeader:
name: CamelKeycloakRoleDescription
expression:
simple:
expression: "${body[description]}"
- to:
uri: keycloak:admin
parameters:
operation: createRole
- log:
message: "Created role: ${header.CamelKeycloakRoleName}"
# Assign role to user route
- route:
from:
uri: direct:assign-role
steps:
- setHeader:
name: CamelKeycloakRealmName
constant: "my-realm"
- setHeader:
name: CamelKeycloakUsername
expression:
simple:
expression: "${body[username]}"
- setHeader:
name: CamelKeycloakRoleName
expression:
simple:
expression: "${body[roleName]}"
- to:
uri: keycloak:admin
parameters:
operation: assignRoleToUser
- log:
message: "Assigned role ${header.CamelKeycloakRoleName} to user ${header.CamelKeycloakUsername}"
Operations Reference
All operations below follow the same usage pattern shown above. Set the operation name in the endpoint URI and pass the required headers.
Realm Operations
| Operation | Required Headers | Description |
|---|---|---|
|
|
|
Create a new realm |
|
|
|
Get realm information |
|
|
|
Update realm settings |
|
|
|
Delete a realm |
Client Operations
| Operation | Required Headers | Description |
|---|---|---|
|
|
|
Create a new client. Optional:
|
|
|
|
Get client information |
|
|
|
Update client settings |
|
|
|
List all clients in a realm |
|
|
|
Delete a client |
Group Operations
| Operation | Required Headers | Description |
|---|---|---|
|
|
|
Create a new group |
|
|
|
Get group information |
|
|
|
Update group settings |
|
|
|
List all groups in a realm |
|
|
|
Delete a group |
|
|
|
Add user to a group |
|
|
|
Remove user from a group |
|
|
|
List groups a user belongs to |
Password Management Operations
| Operation | Required Headers | Description |
|---|---|---|
|
|
|
Reset user password. Optional:
|
User Search Operations
| Operation | Required Headers | Description |
|---|---|---|
|
|
|
Search users by query. Optional:
|
|
|
|
Get roles assigned to a user |
Client Role Operations
| Operation | Required Headers | Description |
|---|---|---|
|
|
|
Create a client role. Optional:
|
|
|
|
Get client role information |
|
|
|
Update a client role |
|
|
|
List all client roles |
|
|
|
Delete a client role |
|
|
|
Assign client role to user |
|
|
|
Remove client role from user |
Session Management Operations
| Operation | Required Headers | Description |
|---|---|---|
|
|
|
List active sessions for a user |
|
|
|
Invalidate all sessions for a user |
|
|
|
Invalidate all sessions in a realm |
Token Management Operations
| Operation | Required Headers | Description |
|---|---|---|
|
|
|
Revoke an access token |
|
|
|
Revoke a refresh token |
|
|
|
Introspect a token for real-time validation |
|
|
|
Invalidate all tokens issued before now |
Client Scope Operations
| Operation | Required Headers | Description |
|---|---|---|
|
|
|
Create a client scope |
|
|
|
Get client scope details |
|
|
|
Update a client scope |
|
|
|
List all client scopes |
|
|
|
Delete a client scope |
Identity Provider Operations
| Operation | Required Headers | Description |
|---|---|---|
|
|
|
Create an OIDC/SAML identity provider |
|
|
|
Get identity provider details |
|
|
|
Update identity provider settings |
|
|
|
List all identity providers |
|
|
|
Delete an identity provider |
Organization Operations (Keycloak 26+)
| Operation | Required Headers | Description |
|---|---|---|
|
|
|
Create organization. Optional:
|
|
|
|
Get organization details |
|
|
|
Update organization |
|
|
|
List all organizations |
|
|
|
Search by name/alias/domain |
|
|
|
Delete an organization |
|
|
|
Add user to organization |
|
|
|
Remove member |
|
|
|
List members |
|
|
|
Link identity provider |
|
|
|
Unlink identity provider |
|
|
|
List linked identity providers |
User Attribute Operations
| Operation | Required Headers | Description |
|---|---|---|
|
|
|
Set a custom attribute on a user |
|
|
|
Get all custom attributes for a user |
|
|
|
Delete a custom attribute |
User Credential and Action Operations
| Operation | Required Headers | Description |
|---|---|---|
|
|
|
Get user credentials list |
|
|
|
Delete a specific credential |
|
|
|
Send email verification |
|
|
|
Send password reset email |
|
|
|
Add required action (e.g.,
|
|
|
|
Remove a required action |
|
|
|
Execute multiple actions via email. Optional:
|
Client Secret Management
| Operation | Required Headers | Description |
|---|---|---|
|
|
|
Retrieve the client secret |
|
|
|
Rotate the client secret |
Authorization Services Operations
| These operations require a client with authorization services enabled in Keycloak. |
| Operation | Required Headers | Description |
|---|---|---|
|
|
|
Create an authorization resource |
|
|
|
Get resource details |
|
|
|
Update a resource |
|
|
|
List all resources |
|
|
|
Delete a resource |
|
|
|
Create authorization policy |
|
|
|
Get policy details |
|
|
|
Update a policy |
|
|
|
List all policies |
|
|
|
Delete a policy |
|
|
|
Create resource permission |
|
|
|
Get permission details |
|
|
|
Update a permission |
|
|
|
List all permissions |
|
|
|
Delete a permission |
Permission Evaluation
The
evaluatePermission
operation allows you to evaluate authorization permissions for a user or service account using Keycloak’s Authorization Services. This operation uses the Keycloak Authorization Client (AuthzClient) to request permissions and obtain a Requesting Party Token (RPT) with granted permissions.
| This operation requires Authorization Services to be enabled on the client in Keycloak. |
Configuration Requirements
-
serverUrl- Keycloak server URL -
realm- Keycloak realm name -
clientId- Client ID with authorization services enabled -
clientSecret- Client secret (required for AuthzClient)
Modes of Operation
The operation supports two modes:
-
RPT Mode (default): Returns a Requesting Party Token (RPT) containing the granted permissions
-
Permissions-Only Mode : Returns only the list of permissions without obtaining an RPT token
Usage Examples
-
Java
-
YAML
// Evaluate all permissions for a user
Map<String, Object> headers = new HashMap<>();
headers.put("CamelKeycloakAccessToken", userAccessToken);
headers.put("CamelKeycloakPermissionsOnly", true);
Map<String, Object> result = template.requestBodyAndHeaders(
"keycloak:authz?serverUrl=http://localhost:8080&realm=myrealm"
+ "&clientId=myapp&clientSecret=secret&operation=evaluatePermission",
null, headers, Map.class);
List<Permission> permissions = (List<Permission>) result.get("permissions");
boolean hasAccess = (Boolean) result.get("granted");
// Check specific resource permissions
Map<String, Object> resourceHeaders = new HashMap<>();
resourceHeaders.put("CamelKeycloakAccessToken", userAccessToken);
resourceHeaders.put("CamelKeycloakPermissionResourceNames", "document1,document2");
resourceHeaders.put("CamelKeycloakPermissionScopes", "read,write");
resourceHeaders.put("CamelKeycloakPermissionsOnly", true);
Map<String, Object> resourceResult = template.requestBodyAndHeaders(
"keycloak:authz?serverUrl=http://localhost:8080&realm=myrealm"
+ "&clientId=myapp&clientSecret=secret&operation=evaluatePermission",
null, resourceHeaders, Map.class);
# Evaluate permissions for a user
- route:
id: evaluate-user-permissions
from:
uri: direct:check-permissions
steps:
- setHeader:
name: CamelKeycloakAccessToken
expression:
simple:
expression: "${header.Authorization.substring(7)}"
- setHeader:
name: CamelKeycloakPermissionsOnly
constant: true
- to:
uri: >
keycloak:authz?
serverUrl={{keycloak.server-url}}&
realm={{keycloak.realm}}&
clientId={{keycloak.client-id}}&
clientSecret={{keycloak.client-secret}}&
operation=evaluatePermission
- log:
message: "User has ${body[permissionCount]} permissions, access granted: ${body[granted]}"
Error Handling
The operation throws exceptions in the following cases:
-
IllegalArgumentException- When required configuration is missing (serverUrl, realm, clientId, clientSecret) -
AuthorizationDeniedException- When the user doesn’t have permission to access the requested resources
Keycloak Setup for Authorization Services
To use the
evaluatePermission
operation, you must configure Authorization Services in Keycloak:
-
Enable Authorization on the client: Go to Clients → Your client → Settings → Enable Authorization :
ON -
Create Resources : Go to Authorization → Resources → Create resources representing protected entities
-
Create Scopes (optional): Go to Authorization → Scopes → Create scopes like "read", "write", "delete"
-
Create Policies : Go to Authorization → Policies → Create policies (role-based, user-based, time-based, etc.)
-
Create Permissions : Go to Authorization → Permissions → Link resources, scopes, and policies together
Bulk Operations
Bulk operations allow you to perform multiple operations in a single request, improving efficiency and reducing network overhead.
Bulk Create Users
-
Java
-
YAML
// Create multiple users at once
List<UserRepresentation> users = new ArrayList<>();
for (int i = 1; i <= 100; i++) {
UserRepresentation user = new UserRepresentation();
user.setUsername("user" + i);
user.setEmail("user" + i + "@company.com");
user.setFirstName("User");
user.setLastName("" + i);
user.setEnabled(true);
users.add(user);
}
Map<String, Object> headers = new HashMap<>();
headers.put("CamelKeycloakRealmName", "my-realm");
headers.put("CamelKeycloakContinueOnError", true); // Continue even if some users fail
Map<String, Object> result = template.requestBodyAndHeaders(
"keycloak:admin?operation=bulkCreateUsers", users, headers, Map.class);
// Result contains summary and details
System.out.println("Total: " + result.get("total"));
System.out.println("Success: " + result.get("success"));
System.out.println("Failed: " + result.get("failed"));
# Bulk create users route
- route:
from:
uri: direct:bulk-create-users
steps:
- setHeader:
name: CamelKeycloakRealmName
constant: "my-realm"
- setHeader:
name: CamelKeycloakContinueOnError
constant: true
- to:
uri: keycloak:admin
parameters:
operation: bulkCreateUsers
- log:
message: "Created ${body[success]} out of ${body[total]} users"
Other Bulk Operations
| Operation | Required Headers | Description |
|---|---|---|
|
|
|
Create multiple users. Optional:
|
|
|
|
Delete multiple users |
|
|
|
Update multiple users |
|
|
|
Assign multiple roles to one user |
|
|
|
Assign one role to multiple users |
Bulk Operations Response Format
All bulk operations return a consistent response format:
{
"total": 10,
"success": 8,
"failed": 2,
"results": [
{
"username": "user1",
"status": "success",
"statusCode": 201
},
{
"username": "user2",
"status": "failed",
"error": "User already exists"
}
]
}
Best Practices for Bulk Operations
-
Use Continue on Error : Always set
continueOnError=truefor bulk operations to get complete feedback on all items -
Monitor Results : Check the results map to identify and handle failures appropriately
-
Batch Size : For very large datasets, consider splitting into smaller batches (e.g., 100-500 users per batch)
-
Transactions : Note that Keycloak operations are not transactional - some items may succeed while others fail
Complete Producer Example
-
Java
-
YAML
// Configure Keycloak component
KeycloakComponent keycloak = getContext().getComponent("keycloak", KeycloakComponent.class);
KeycloakConfiguration config = new KeycloakConfiguration();
config.setServerUrl("http://localhost:8080");
config.setRealm("master");
config.setUsername("admin");
config.setPassword("admin");
keycloak.setConfiguration(config);
// Comprehensive user management route
from("direct:setup-user-environment")
.routeId("setup-user-environment")
.log("Setting up user environment...")
// Step 1: Create realm
.setHeader("CamelKeycloakRealmName", constant("my-company"))
.to("keycloak:admin?operation=createRealm")
// Step 2: Create roles
.setHeader("CamelKeycloakRoleName", constant("admin"))
.setHeader("CamelKeycloakRoleDescription", constant("Administrator role"))
.to("keycloak:admin?operation=createRole")
// Step 3: Create client
.setHeader("CamelKeycloakClientId", constant("my-app"))
.setHeader("CamelKeycloakClientSecretRequired", constant(true))
.to("keycloak:admin?operation=createClient")
// Step 4: Create user
.setHeader("CamelKeycloakUsername", constant("admin.user"))
.setHeader("CamelKeycloakUserEmail", constant("admin@company.com"))
.to("keycloak:admin?operation=createUser")
// Step 5: Set password and assign role
.setHeader("CamelKeycloakUserPassword", constant("admin123"))
.to("keycloak:admin?operation=setUserPassword")
.setHeader("CamelKeycloakRoleName", constant("admin"))
.to("keycloak:admin?operation=assignRoleToUser")
.transform().constant("User environment setup completed successfully");
# Complete Keycloak producer configuration
- route:
id: setup-user-environment
from:
uri: direct:setup-user-environment
steps:
- log:
message: "Setting up user environment..."
- setHeader:
name: CamelKeycloakRealmName
constant: "my-company"
- to:
uri: keycloak:admin
parameters:
operation: createRealm
- setHeader:
name: CamelKeycloakRoleName
constant: "admin"
- to:
uri: keycloak:admin
parameters:
operation: createRole
- setHeader:
name: CamelKeycloakClientId
constant: "my-app"
- to:
uri: keycloak:admin
parameters:
operation: createClient
- setHeader:
name: CamelKeycloakUsername
constant: "admin.user"
- setHeader:
name: CamelKeycloakUserEmail
constant: "admin@company.com"
- to:
uri: keycloak:admin
parameters:
operation: createUser
- setHeader:
name: CamelKeycloakUserPassword
constant: "admin123"
- to:
uri: keycloak:admin
parameters:
operation: setUserPassword
- setHeader:
name: CamelKeycloakRoleName
constant: "admin"
- to:
uri: keycloak:admin
parameters:
operation: assignRoleToUser
- transform:
constant: "User environment setup completed successfully"
# Component configuration
camel:
component:
keycloak:
server-url: "http://localhost:8080"
realm: "master"
username: "admin"
password: "admin"