Skip to content

User Federation

Use user federation when Keycloak should authenticate users against an external directory or user store instead of managing every account in its own database. LDAP and Active Directory federation let users sign in with their existing directory credentials, while mapper resources control how LDAP attributes, groups, and roles are projected into Keycloak. Use the custom user federation CRD when you have a Keycloak user storage SPI provider that is not LDAP-based.

API Reference

KindAPI GroupTerraformCRD Explorer
UserFederationldap.keycloak.crossplane.io/v1alpha1keycloak_ldap_user_federationView CRD Schema
UserAttributeMapperldap.keycloak.crossplane.io/v1alpha1keycloak_ldap_user_attribute_mapperView CRD Schema
FullNameMapperldap.keycloak.crossplane.io/v1alpha1keycloak_ldap_full_name_mapperView CRD Schema
GroupMapperldap.keycloak.crossplane.io/v1alpha1keycloak_ldap_group_mapperView CRD Schema
RoleMapperldap.keycloak.crossplane.io/v1alpha1keycloak_ldap_role_mapperView CRD Schema
HardcodedAttributeMapperldap.keycloak.crossplane.io/v1alpha1keycloak_ldap_hardcoded_attribute_mapperView CRD Schema
HardcodedGroupMapperldap.keycloak.crossplane.io/v1alpha1keycloak_ldap_hardcoded_group_mapperView CRD Schema
HardcodedRoleMapperldap.keycloak.crossplane.io/v1alpha1keycloak_ldap_hardcoded_role_mapperView CRD Schema
MsadUserAccountControlMapperldap.keycloak.crossplane.io/v1alpha1keycloak_ldap_msad_user_account_control_mapperView CRD Schema
MsadLdsUserAccountControlMapperldap.keycloak.crossplane.io/v1alpha1keycloak_ldap_msad_lds_user_account_control_mapperView CRD Schema
CustomMapperldap.keycloak.crossplane.io/v1alpha1keycloak_ldap_custom_mapperView CRD Schema
UserFederationuser.keycloak.crossplane.io/v1alpha1keycloak_custom_user_federationView CRD Schema

Working YAML examples

LDAP UserFederation

apiVersion: ldap.keycloak.crossplane.io/v1alpha1
kind: UserFederation
metadata:
  name: ldap-user-federation
spec:
  deletionPolicy: Delete
  forProvider:
    bindCredentialSecretRef:
      key: secret
      name: bind-credential-secret
      namespace: dev
    bindDn: cn=admin,dc=example,dc=org
    connectionTimeout: 5s
    connectionUrl: ldap://openldap
    enabled: false
    kerberos:
      - kerberosRealm: FOO.LOCAL
        keyTab: /etc/host.keytab
        serverPrincipal: HTTP/host.foo.com@FOO.LOCAL
    name: openldap
    rdnLdapAttribute: cn
    readTimeout: 10s
    realmIdRef:
      name: "dev"
      policy:
        resolve: Always
    userObjectClasses:
      - simpleSecurityObject
      - organizationalRole
    usernameLdapAttribute: cn
    usersDn: dc=example,dc=org
    uuidLdapAttribute: entryDN
    deleteDefaultMappers: false
  providerConfigRef:
    name: "keycloak-provider-config"

UserAttributeMapper

apiVersion: ldap.keycloak.crossplane.io/v1alpha1
kind: UserAttributeMapper
metadata:
  name: ldap-user-attribute-mapper
spec:
  deletionPolicy: Delete
  forProvider:
    ldapAttribute: bar
    ldapUserFederationIdRef:
      name: ldap-user-federation
      policy:
        resolve: Always
    name: user-attribute-mapper
    realmIdRef:
      name: "dev"
      policy:
        resolve: Always
    userModelAttribute: foo
  providerConfigRef:
    name: "keycloak-provider-config"

FullNameMapper

apiVersion: ldap.keycloak.crossplane.io/v1alpha1
kind: FullNameMapper
metadata:
  name: ldap-full-name-mapper
spec:
  deletionPolicy: Delete
  forProvider:
    ldapFullNameAttribute: cn
    ldapUserFederationIdRef:
      name: ldap-user-federation
      policy:
        resolve: Always
    name: full-name-mapper
    realmIdRef:
      name: "dev"
      policy:
        resolve: Always
  providerConfigRef:
    name: "keycloak-provider-config"

GroupMapper

apiVersion: ldap.keycloak.crossplane.io/v1alpha1
kind: GroupMapper
metadata:
  name: ldap-group-mapper
spec:
  deletionPolicy: Delete
  forProvider:
    groupNameLdapAttribute: cn
    groupObjectClasses:
      - groupOfNames
    ldapGroupsDn: dc=example,dc=org
    ldapUserFederationIdRef:
      name: ldap-user-federation
      policy:
        resolve: Always
    memberofLdapAttribute: memberOf
    membershipAttributeType: DN
    membershipLdapAttribute: member
    membershipUserLdapAttribute: cn
    name: group-mapper
    realmIdRef:
      name: "dev"
      policy:
        resolve: Always
  providerConfigRef:
    name: "keycloak-provider-config"

RoleMapper

apiVersion: ldap.keycloak.crossplane.io/v1alpha1
kind: RoleMapper
metadata:
  name: ldap-role-mapper
spec:
  deletionPolicy: Delete
  forProvider:
    ldapRolesDn: dc=example,dc=org
    ldapUserFederationIdRef:
      name: ldap-user-federation
      policy:
        resolve: Always
    memberofLdapAttribute: memberOf
    membershipAttributeType: DN
    membershipLdapAttribute: member
    membershipUserLdapAttribute: cn
    name: role-mapper
    realmIdRef:
      name: "dev"
      policy:
        resolve: Always
    roleNameLdapAttribute: cn
    roleObjectClasses:
      - groupOfNames
    userRolesRetrieveStrategy: GET_ROLES_FROM_USER_MEMBEROF_ATTRIBUTE
  providerConfigRef:
    name: "keycloak-provider-config"

HardcodedRoleMapper

apiVersion: ldap.keycloak.crossplane.io/v1alpha1
kind: HardcodedRoleMapper
metadata:
  name: assign-test-role-to-all-users
spec:
  deletionPolicy: Delete
  forProvider:
    ldapUserFederationIdRef:
      name: ldap-user-federation
      policy:
        resolve: Always
    name: assign-test-role-to-all-users
    realmIdRef:
      name: "dev"
      policy:
        resolve: Always
    roleRef:
      name: test
  providerConfigRef:
    name: "keycloak-provider-config"

HardcodedGroupMapper

apiVersion: ldap.keycloak.crossplane.io/v1alpha1
kind: HardcodedGroupMapper
metadata:
  name: assign-group-to-users
spec:
  deletionPolicy: Delete
  forProvider:
    groupRef:
      name: test
    ldapUserFederationIdRef:
      name: ldap-user-federation
      policy:
        resolve: Always
    name: assign-group-to-users
    realmIdRef:
      name: "dev"
      policy:
        resolve: Always
  providerConfigRef:
    name: "keycloak-provider-config"

HardcodedAttributeMapper

apiVersion: ldap.keycloak.crossplane.io/v1alpha1
kind: HardcodedAttributeMapper
metadata:
  name: assign-bar-to-foo
spec:
  deletionPolicy: Delete
  forProvider:
    attributeName: foo
    attributeValue: bar
    ldapUserFederationIdRef:
      name: ldap-user-federation
      policy:
        resolve: Always
    name: assign-foo-to-bar
    realmIdRef:
      name: "dev"
      policy:
        resolve: Always
  providerConfigRef:
    name: "keycloak-provider-config"

MsadUserAccountControlMapper

apiVersion: ldap.keycloak.crossplane.io/v1alpha1
kind: MsadUserAccountControlMapper
metadata:
  name: msad-user-account-control-mapper
spec:
  deletionPolicy: Delete
  forProvider:
    ldapUserFederationIdRef:
      name: ldap-user-federation
      policy:
        resolve: Always
    name: msad-user-account-control-mapper
    realmIdRef:
      name: "dev"
      policy:
        resolve: Always
  providerConfigRef:
    name: "keycloak-provider-config"

MsadLdsUserAccountControlMapper

apiVersion: ldap.keycloak.crossplane.io/v1alpha1
kind: MsadLdsUserAccountControlMapper
metadata:
  name: msad-lds-user-account-control-mapper
spec:
  deletionPolicy: Delete
  forProvider:
    ldapUserFederationIdRef:
      name: ldap-user-federation
      policy:
        resolve: Always
    name: msad-lds-user-account-control-mapper
    realmIdRef:
      name: "dev"
      policy:
        resolve: Always
  providerConfigRef:
    name: "keycloak-provider-config"

CustomMapper

apiVersion: ldap.keycloak.crossplane.io/v1alpha1
kind: CustomMapper
metadata:
  name: custom-mapper
spec:
  deletionPolicy: Delete
  forProvider:
    config:
      ldap.full.name.attribute: cn
    ldapUserFederationIdRef:
      name: ldap-user-federation
      policy:
        resolve: Always
    name: custom-mapper
    providerId: "full-name-ldap-mapper"
    providerType: "org.keycloak.storage.ldap.mappers.LDAPStorageMapper"
    realmIdRef:
      name: "dev"
      policy:
        resolve: Always
  providerConfigRef:
    name: "keycloak-provider-config"

Custom UserFederation

apiVersion: user.keycloak.crossplane.io/v1alpha1
kind: UserFederation
metadata:
  name: custom-user-federation
spec:
  deletionPolicy: Delete
  forProvider:
    config:
      dummyBool: true
      dummyString: foobar
      multivalue: value1##value2
    enabled: true
    name: custom
    providerId: custom
    realmIdSelector:
      matchLabels:
        testing.upbound.io/example-name: realm
  providerConfigRef:
    name: "keycloak-provider-config"

Related Resources