keycloak
静的公開メンバ関数 | 全メンバ一覧
org.keycloak.storage.ldap.LDAPUtils クラス
org.keycloak.storage.ldap.LDAPUtils 連携図
Collaboration graph

静的公開メンバ関数

static LDAPObject addUserToLDAP (LDAPStorageProvider ldapProvider, RealmModel realm, UserModel user)
 
static LDAPQuery createQueryForUserSearch (LDAPStorageProvider ldapProvider, RealmModel realm)
 
static void computeAndSetDn (LDAPConfig config, LDAPObject ldapUser)
 
static String getUsername (LDAPObject ldapUser, LDAPConfig config)
 
static void checkUuid (LDAPObject ldapUser, LDAPConfig config)
 
static LDAPObject createLDAPGroup (LDAPStorageProvider ldapProvider, String groupName, String groupNameAttribute, Collection< String > objectClasses, String parentDn, Map< String, Set< String >> additionalAttributes)
 
static void addMember (LDAPStorageProvider ldapProvider, MembershipType membershipType, String memberAttrName, String memberChildAttrName, LDAPObject ldapParent, LDAPObject ldapChild, boolean sendLDAPUpdateRequest)
 
static void deleteMember (LDAPStorageProvider ldapProvider, MembershipType membershipType, String memberAttrName, String memberChildAttrName, LDAPObject ldapParent, LDAPObject ldapChild)
 
static Set< String > getExistingMemberships (String memberAttrName, LDAPObject ldapRole)
 
static String getMemberValueOfChildObject (LDAPObject ldapUser, MembershipType membershipType, String memberChildAttrName)
 
static List< LDAPObjectloadAllLDAPObjects (LDAPQuery ldapQuery, LDAPStorageProvider ldapProvider)
 
static void validateCustomLdapFilter (String customFilter) throws ComponentValidationException
 

詳解

Allow to directly call some operations against LDAPIdentityStore.

著者
Marek Posolda

関数詳解

◆ addMember()

static void org.keycloak.storage.ldap.LDAPUtils.addMember ( LDAPStorageProvider  ldapProvider,
MembershipType  membershipType,
String  memberAttrName,
String  memberChildAttrName,
LDAPObject  ldapParent,
LDAPObject  ldapChild,
boolean  sendLDAPUpdateRequest 
)
inlinestatic

Add ldapChild as member of ldapParent and save ldapParent to LDAP.

引数
ldapProvider
membershipTypehow is 'member' attribute saved (full DN or just uid)
memberAttrNameusually 'member'
memberChildAttrNameused just if membershipType is UID. Usually 'uid'
ldapParentrole or group
ldapChildusually user (or child group or child role)
sendLDAPUpdateRequestif true, the method will send LDAP update request too. Otherwise it will skip it
161  {
162 
163  Set<String> memberships = getExistingMemberships(memberAttrName, ldapParent);
164 
165  // Remove membership placeholder if present
166  if (membershipType == MembershipType.DN) {
167  for (String membership : memberships) {
168  if (LDAPConstants.EMPTY_MEMBER_ATTRIBUTE_VALUE.equals(membership)) {
169  memberships.remove(membership);
170  break;
171  }
172  }
173  }
174 
175  String membership = getMemberValueOfChildObject(ldapChild, membershipType, memberChildAttrName);
176 
177  memberships.add(membership);
178  ldapParent.setAttribute(memberAttrName, memberships);
179 
180  if (sendLDAPUpdateRequest) {
181  ldapProvider.getLdapIdentityStore().update(ldapParent);
182  }
183  }
static String getMemberValueOfChildObject(LDAPObject ldapUser, MembershipType membershipType, String memberChildAttrName)
Definition: LDAPUtils.java:229
static Set< String > getExistingMemberships(String memberAttrName, LDAPObject ldapRole)
Definition: LDAPUtils.java:218

◆ addUserToLDAP()

static LDAPObject org.keycloak.storage.ldap.LDAPUtils.addUserToLDAP ( LDAPStorageProvider  ldapProvider,
RealmModel  realm,
UserModel  user 
)
inlinestatic
引数
ldapProvider
realm
user
戻り値
newly created LDAPObject with all the attributes, uuid and DN properly set
55  {
56  LDAPObject ldapUser = new LDAPObject();
57 
58  LDAPIdentityStore ldapStore = ldapProvider.getLdapIdentityStore();
59  LDAPConfig ldapConfig = ldapStore.getConfig();
60  ldapUser.setRdnAttributeName(ldapConfig.getRdnLdapAttribute());
61  ldapUser.setObjectClasses(ldapConfig.getUserObjectClasses());
62 
63  List<ComponentModel> federationMappers = realm.getComponents(ldapProvider.getModel().getId(), LDAPStorageMapper.class.getName());
64  List<ComponentModel> sortedMappers = ldapProvider.getMapperManager().sortMappersAsc(federationMappers);
65  for (ComponentModel mapperModel : sortedMappers) {
66  LDAPStorageMapper ldapMapper = ldapProvider.getMapperManager().getMapper(mapperModel);
67  ldapMapper.onRegisterUserToLDAP(ldapUser, user, realm);
68  }
69 
70  LDAPUtils.computeAndSetDn(ldapConfig, ldapUser);
71  ldapStore.add(ldapUser);
72  return ldapUser;
73  }

◆ checkUuid()

static void org.keycloak.storage.ldap.LDAPUtils.checkUuid ( LDAPObject  ldapUser,
LDAPConfig  config 
)
inlinestatic
119  {
120  if (ldapUser.getUuid() == null) {
121  throw new ModelException("User returned from LDAP has null uuid! Check configuration of your LDAP settings. UUID Attribute must be unique among your LDAP records and available on all the LDAP user records. " +
122  "If your LDAP server really doesn't support the notion of UUID, you can use any other attribute, which is supposed to be unique among LDAP users in tree. For example 'uid' or 'entryDN' . " +
123  "Mapped UUID LDAP attribute: " + config.getUuidLDAPAttributeName() + ", user DN: " + ldapUser.getDn());
124  }
125  }

◆ computeAndSetDn()

static void org.keycloak.storage.ldap.LDAPUtils.computeAndSetDn ( LDAPConfig  config,
LDAPObject  ldapUser 
)
inlinestatic
95  {
96  String rdnLdapAttrName = config.getRdnLdapAttribute();
97  String rdnLdapAttrValue = ldapUser.getAttributeAsString(rdnLdapAttrName);
98  if (rdnLdapAttrValue == null) {
99  throw new ModelException("RDN Attribute [" + rdnLdapAttrName + "] is not filled. Filled attributes: " + ldapUser.getAttributes());
100  }
101 
102  LDAPDn dn = LDAPDn.fromString(config.getUsersDn());
103  dn.addFirst(rdnLdapAttrName, rdnLdapAttrValue);
104  ldapUser.setDn(dn);
105  }

◆ createLDAPGroup()

static LDAPObject org.keycloak.storage.ldap.LDAPUtils.createLDAPGroup ( LDAPStorageProvider  ldapProvider,
String  groupName,
String  groupNameAttribute,
Collection< String >  objectClasses,
String  parentDn,
Map< String, Set< String >>  additionalAttributes 
)
inlinestatic
131  {
132  LDAPObject ldapObject = new LDAPObject();
133 
134  ldapObject.setRdnAttributeName(groupNameAttribute);
135  ldapObject.setObjectClasses(objectClasses);
136  ldapObject.setSingleAttribute(groupNameAttribute, groupName);
137 
138  LDAPDn roleDn = LDAPDn.fromString(parentDn);
139  roleDn.addFirst(groupNameAttribute, groupName);
140  ldapObject.setDn(roleDn);
141 
142  for (Map.Entry<String, Set<String>> attrEntry : additionalAttributes.entrySet()) {
143  ldapObject.setAttribute(attrEntry.getKey(), attrEntry.getValue());
144  }
145 
146  ldapProvider.getLdapIdentityStore().add(ldapObject);
147  return ldapObject;
148  }

◆ createQueryForUserSearch()

static LDAPQuery org.keycloak.storage.ldap.LDAPUtils.createQueryForUserSearch ( LDAPStorageProvider  ldapProvider,
RealmModel  realm 
)
inlinestatic
75  {
76  LDAPQuery ldapQuery = new LDAPQuery(ldapProvider);
77  LDAPConfig config = ldapProvider.getLdapIdentityStore().getConfig();
78  ldapQuery.setSearchScope(config.getSearchScope());
79  ldapQuery.setSearchDn(config.getUsersDn());
80  ldapQuery.addObjectClasses(config.getUserObjectClasses());
81 
82  String customFilter = config.getCustomUserSearchFilter();
83  if (customFilter != null) {
84  Condition customFilterCondition = new LDAPQueryConditionsBuilder().addCustomLDAPFilter(customFilter);
85  ldapQuery.addWhereCondition(customFilterCondition);
86  }
87 
88  List<ComponentModel> mapperModels = realm.getComponents(ldapProvider.getModel().getId(), LDAPStorageMapper.class.getName());
89  ldapQuery.addMappers(mapperModels);
90 
91  return ldapQuery;
92  }

◆ deleteMember()

static void org.keycloak.storage.ldap.LDAPUtils.deleteMember ( LDAPStorageProvider  ldapProvider,
MembershipType  membershipType,
String  memberAttrName,
String  memberChildAttrName,
LDAPObject  ldapParent,
LDAPObject  ldapChild 
)
inlinestatic

Remove ldapChild as member of ldapParent and save ldapParent to LDAP.

引数
ldapProvider
membershipTypehow is 'member' attribute saved (full DN or just uid)
memberAttrNameusually 'member'
memberChildAttrNameused just if membershipType is UID. Usually 'uid'
ldapParentrole or group
ldapChildusually user (or child group or child role)
195  {
196  Set<String> memberships = getExistingMemberships(memberAttrName, ldapParent);
197 
198  String userMembership = getMemberValueOfChildObject(ldapChild, membershipType, memberChildAttrName);
199 
200  memberships.remove(userMembership);
201 
202  // Some membership placeholder needs to be always here as "member" is mandatory attribute on some LDAP servers. But not on active directory! (Placeholder, which not matches any real object is not allowed here)
203  if (memberships.size() == 0 && membershipType== MembershipType.DN && !ldapProvider.getLdapIdentityStore().getConfig().isActiveDirectory()) {
204  memberships.add(LDAPConstants.EMPTY_MEMBER_ATTRIBUTE_VALUE);
205  }
206 
207  ldapParent.setAttribute(memberAttrName, memberships);
208  ldapProvider.getLdapIdentityStore().update(ldapParent);
209  }
static String getMemberValueOfChildObject(LDAPObject ldapUser, MembershipType membershipType, String memberChildAttrName)
Definition: LDAPUtils.java:229
static Set< String > getExistingMemberships(String memberAttrName, LDAPObject ldapRole)
Definition: LDAPUtils.java:218

◆ getExistingMemberships()

static Set<String> org.keycloak.storage.ldap.LDAPUtils.getExistingMemberships ( String  memberAttrName,
LDAPObject  ldapRole 
)
inlinestatic

Return all existing memberships (values of attribute 'member' ) from the given ldapRole or ldapGroup

引数
memberAttrNameusually 'member'
ldapRole
戻り値
218  {
219  Set<String> memberships = ldapRole.getAttributeAsSet(memberAttrName);
220  if (memberships == null) {
221  memberships = new HashSet<>();
222  }
223  return memberships;
224  }

◆ getMemberValueOfChildObject()

static String org.keycloak.storage.ldap.LDAPUtils.getMemberValueOfChildObject ( LDAPObject  ldapUser,
MembershipType  membershipType,
String  memberChildAttrName 
)
inlinestatic

Get value to be used as attribute 'member' or 'memberUid' in some parent ldapObject

229  {
230  if (membershipType == MembershipType.DN) {
231  return ldapUser.getDn().toString();
232  } else {
233  return ldapUser.getAttributeAsString(memberChildAttrName);
234  }
235  }

◆ getUsername()

static String org.keycloak.storage.ldap.LDAPUtils.getUsername ( LDAPObject  ldapUser,
LDAPConfig  config 
)
inlinestatic
107  {
108  String usernameAttr = config.getUsernameLdapAttribute();
109  String ldapUsername = ldapUser.getAttributeAsString(usernameAttr);
110 
111  if (ldapUsername == null) {
112  throw new ModelException("User returned from LDAP has null username! Check configuration of your LDAP mappings. Mapped username LDAP attribute: " +
113  config.getUsernameLdapAttribute() + ", user DN: " + ldapUser.getDn() + ", attributes from LDAP: " + ldapUser.getAttributes());
114  }
115 
116  return ldapUsername;
117  }

◆ loadAllLDAPObjects()

static List<LDAPObject> org.keycloak.storage.ldap.LDAPUtils.loadAllLDAPObjects ( LDAPQuery  ldapQuery,
LDAPStorageProvider  ldapProvider 
)
inlinestatic

Load all LDAP objects corresponding to given query. We will load them paginated, so we allow to bypass the limitation of 1000 maximum loaded objects in single query in MSAD

引数
ldapQuery
ldapProvider
戻り値
246  {
247  LDAPConfig ldapConfig = ldapProvider.getLdapIdentityStore().getConfig();
248  boolean pagination = ldapConfig.isPagination();
249  if (pagination) {
250  // For now reuse globally configured batch size in LDAP provider page
251  int pageSize = ldapConfig.getBatchSizeForSync();
252 
253  List<LDAPObject> result = new LinkedList<>();
254  boolean nextPage = true;
255 
256  while (nextPage) {
257  ldapQuery.setLimit(pageSize);
258  final List<LDAPObject> currentPageGroups = ldapQuery.getResultList();
259  result.addAll(currentPageGroups);
260  nextPage = ldapQuery.getPaginationContext() != null;
261  }
262 
263  return result;
264  } else {
265  // LDAP pagination not available. Do everything in single transaction
266  return ldapQuery.getResultList();
267  }
268  }

◆ validateCustomLdapFilter()

static void org.keycloak.storage.ldap.LDAPUtils.validateCustomLdapFilter ( String  customFilter) throws ComponentValidationException
inlinestatic

Validate configured customFilter matches the requested format

引数
customFilter
例外
ComponentValidationException
277  {
278  if (customFilter != null) {
279 
280  customFilter = customFilter.trim();
281  if (customFilter.isEmpty()) {
282  return;
283  }
284 
285  if (!customFilter.startsWith("(") || !customFilter.endsWith(")")) {
286  throw new ComponentValidationException("ldapErrorInvalidCustomFilter");
287  }
288  }
289  }

このクラス詳解は次のファイルから抽出されました: