keycloak-service
公開メンバ関数 | 静的公開変数類 | 静的関数 | 非公開メンバ関数 | 静的非公開変数類 | 全メンバ一覧
org.keycloak.broker.saml.mappers.UserAttributeStatementMapper クラス
org.keycloak.broker.saml.mappers.UserAttributeStatementMapper の継承関係図
Inheritance graph
org.keycloak.broker.saml.mappers.UserAttributeStatementMapper 連携図
Collaboration graph

公開メンバ関数

List< ProviderConfigProperty > getConfigProperties ()
 
String getId ()
 
String [] getCompatibleProviders ()
 
String getDisplayCategory ()
 
String getDisplayType ()
 
void preprocessFederatedIdentity (KeycloakSession session, RealmModel realm, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context)
 
void updateBrokeredUser (KeycloakSession session, RealmModel realm, UserModel user, IdentityProviderMapperModel mapperModel, BrokeredIdentityContext context)
 
String getHelpText ()
 

静的公開変数類

static final String ATTRIBUTE_NAME_PATTERN = "attribute.name.pattern"
 
static final String USER_ATTRIBUTE_FIRST_NAME = "user.attribute.firstName"
 
static final String USER_ATTRIBUTE_LAST_NAME = "user.attribute.lastName"
 
static final String USER_ATTRIBUTE_EMAIL = "user.attribute.email"
 
static final String USER_ATTRIBUTE_LANGUAGE = "user.attribute.language"
 
static final String PROVIDER_ID = "saml-user-attributestatement-idp-mapper"
 

静的関数

 [static initializer]
 

非公開メンバ関数

Optional< Pattern > getAttributePattern (IdentityProviderMapperModel mapperModel)
 
List< AttributeType > findAttributesInContext (BrokeredIdentityContext context, Optional< Pattern > attributePattern)
 
void setIfNotEmpty (Consumer< String > consumer, List< String > values)
 

静的非公開変数類

static final String USER_ATTR_LOCALE = "locale"
 
static final String [] COMPATIBLE_PROVIDERS = {SAMLIdentityProviderFactory.PROVIDER_ID}
 
static final List< ProviderConfigProperty > CONFIG_PROPERTIES = new ArrayList<>()
 
static final String USE_FRIENDLY_NAMES = "use.friendly.names"
 

詳解

著者
Frederik Libert

関数詳解

◆ [static initializer]()

org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.[static initializer] ( )
inlinestaticpackage

◆ findAttributesInContext()

List<AttributeType> org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.findAttributesInContext ( BrokeredIdentityContext  context,
Optional< Pattern >  attributePattern 
)
inlineprivate
204  {
205  AssertionType assertion = (AssertionType) context.getContextData().get(SAMLEndpoint.SAML_ASSERTION);
206 
207  return assertion.getAttributeStatements().stream()//
208  .flatMap(statement -> statement.getAttributes().stream())//
209  .filter(item -> !attributePattern.isPresent() || attributePattern.get().matcher(item.getAttribute().getName()).matches())//
210  .map(ASTChoiceType::getAttribute)//
211  .collect(Collectors.toList());
212  }

◆ getAttributePattern()

Optional<Pattern> org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.getAttributePattern ( IdentityProviderMapperModel  mapperModel)
inlineprivate
199  {
200  String attributePatternConfig = mapperModel.getConfig().get(ATTRIBUTE_NAME_PATTERN);
201  return Optional.ofNullable(attributePatternConfig != null ? Pattern.compile(attributePatternConfig) : null);
202  }
static final String ATTRIBUTE_NAME_PATTERN
Definition: UserAttributeStatementMapper.java:42

◆ getCompatibleProviders()

String [] org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.getCompatibleProviders ( )
inline
107  {
108  return COMPATIBLE_PROVIDERS.clone();
109  }
static final String [] COMPATIBLE_PROVIDERS
Definition: UserAttributeStatementMapper.java:38

◆ getConfigProperties()

List<ProviderConfigProperty> org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.getConfigProperties ( )
inline
97  {
98  return CONFIG_PROPERTIES;
99  }
static final List< ProviderConfigProperty > CONFIG_PROPERTIES
Definition: UserAttributeStatementMapper.java:40

◆ getDisplayCategory()

String org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.getDisplayCategory ( )
inline
112  {
113  return "AttributeStatement Importer";
114  }

◆ getDisplayType()

String org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.getDisplayType ( )
inline
117  {
118  return "AttributeStatement Importer";
119  }

◆ getHelpText()

String org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.getHelpText ( )
inline
195  {
196  return "Import all saml attributes found in attributestatements in assertion into user properties or attributes.";
197  }

◆ getId()

String org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.getId ( )
inline
102  {
103  return PROVIDER_ID;
104  }
static final String PROVIDER_ID
Definition: UserAttributeStatementMapper.java:94

◆ preprocessFederatedIdentity()

void org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.preprocessFederatedIdentity ( KeycloakSession  session,
RealmModel  realm,
IdentityProviderMapperModel  mapperModel,
BrokeredIdentityContext  context 
)
inline
122  {
123  String firstNameAttribute = mapperModel.getConfig().get(USER_ATTRIBUTE_FIRST_NAME);
124  String lastNameAttribute = mapperModel.getConfig().get(USER_ATTRIBUTE_LAST_NAME);
125  String emailAttribute = mapperModel.getConfig().get(USER_ATTRIBUTE_EMAIL);
126  String langAttribute = mapperModel.getConfig().get(USER_ATTRIBUTE_LANGUAGE);
127  Boolean useFriendlyNames = Boolean.valueOf(mapperModel.getConfig().get(USE_FRIENDLY_NAMES));
128  List<AttributeType> attributesInContext = findAttributesInContext(context, getAttributePattern(mapperModel));
129  for (AttributeType a : attributesInContext) {
130  String attribute = useFriendlyNames ? a.getFriendlyName() : a.getName();
131  List<String> attributeValuesInContext = a.getAttributeValue().stream().filter(Objects::nonNull).map(Object::toString).collect(Collectors.toList());
132  if (!attributeValuesInContext.isEmpty()) {
133  // set as attribute anyway
134  context.setUserAttribute(attribute, attributeValuesInContext);
135  // set as special field ?
136  if (Objects.equals(attribute, emailAttribute)) {
137  setIfNotEmpty(context::setEmail, attributeValuesInContext);
138  } else if (Objects.equals(attribute, firstNameAttribute)) {
139  setIfNotEmpty(context::setFirstName, attributeValuesInContext);
140  } else if (Objects.equals(attribute, lastNameAttribute)) {
141  setIfNotEmpty(context::setLastName, attributeValuesInContext);
142  } else if (Objects.equals(attribute, langAttribute)) {
143  context.setUserAttribute(USER_ATTR_LOCALE, attributeValuesInContext);
144  }
145  }
146  }
147  }
void setIfNotEmpty(Consumer< String > consumer, List< String > values)
Definition: UserAttributeStatementMapper.java:214
static final String USER_ATTRIBUTE_EMAIL
Definition: UserAttributeStatementMapper.java:48
static final String USER_ATTR_LOCALE
Definition: UserAttributeStatementMapper.java:36
static final String USER_ATTRIBUTE_FIRST_NAME
Definition: UserAttributeStatementMapper.java:44
static final String USER_ATTRIBUTE_LANGUAGE
Definition: UserAttributeStatementMapper.java:50
Optional< Pattern > getAttributePattern(IdentityProviderMapperModel mapperModel)
Definition: UserAttributeStatementMapper.java:199
List< AttributeType > findAttributesInContext(BrokeredIdentityContext context, Optional< Pattern > attributePattern)
Definition: UserAttributeStatementMapper.java:204
static final String USE_FRIENDLY_NAMES
Definition: UserAttributeStatementMapper.java:52
static final String USER_ATTRIBUTE_LAST_NAME
Definition: UserAttributeStatementMapper.java:46

◆ setIfNotEmpty()

void org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.setIfNotEmpty ( Consumer< String >  consumer,
List< String >  values 
)
inlineprivate
214  {
215  if (values != null && !values.isEmpty()) {
216  consumer.accept(values.get(0));
217  }
218  }

◆ updateBrokeredUser()

void org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.updateBrokeredUser ( KeycloakSession  session,
RealmModel  realm,
UserModel  user,
IdentityProviderMapperModel  mapperModel,
BrokeredIdentityContext  context 
)
inline
150  {
151  String firstNameAttribute = mapperModel.getConfig().get(USER_ATTRIBUTE_FIRST_NAME);
152  String lastNameAttribute = mapperModel.getConfig().get(USER_ATTRIBUTE_LAST_NAME);
153  String emailAttribute = mapperModel.getConfig().get(USER_ATTRIBUTE_EMAIL);
154  String langAttribute = mapperModel.getConfig().get(USER_ATTRIBUTE_LANGUAGE);
155  Boolean useFriendlyNames = Boolean.valueOf(mapperModel.getConfig().get(USE_FRIENDLY_NAMES));
156  List<AttributeType> attributesInContext = findAttributesInContext(context, getAttributePattern(mapperModel));
157 
158  Set<String> assertedUserAttributes = new HashSet<String>();
159  for (AttributeType a : attributesInContext) {
160  String attribute = useFriendlyNames ? a.getFriendlyName() : a.getName();
161  List<String> attributeValuesInContext = a.getAttributeValue().stream().filter(Objects::nonNull).map(Object::toString).collect(Collectors.toList());
162  List<String> currentAttributeValues = user.getAttributes().get(attribute);
163  if (attributeValuesInContext == null) {
164  // attribute no longer sent by brokered idp, remove it
165  user.removeAttribute(attribute);
166  } else if (currentAttributeValues == null) {
167  // new attribute sent by brokered idp, add it
168  user.setAttribute(attribute, attributeValuesInContext);
169  } else if (!CollectionUtil.collectionEquals(attributeValuesInContext, currentAttributeValues)) {
170  // attribute sent by brokered idp has different values as before, update it
171  user.setAttribute(attribute, attributeValuesInContext);
172  }
173  if (Objects.equals(attribute, emailAttribute)) {
174  setIfNotEmpty(context::setEmail, attributeValuesInContext);
175  } else if (Objects.equals(attribute, firstNameAttribute)) {
176  setIfNotEmpty(context::setFirstName, attributeValuesInContext);
177  } else if (Objects.equals(attribute, lastNameAttribute)) {
178  setIfNotEmpty(context::setLastName, attributeValuesInContext);
179  } else if (Objects.equals(attribute, langAttribute)) {
180  if(attributeValuesInContext == null) {
181  user.removeAttribute(USER_ATTR_LOCALE);
182  } else {
183  user.setAttribute(USER_ATTR_LOCALE, attributeValuesInContext);
184  }
185  assertedUserAttributes.add(USER_ATTR_LOCALE);
186  }
187  // Mark attribute as handled
188  assertedUserAttributes.add(attribute);
189  }
190  // Remove user attributes that were not referenced in assertion.
191  user.getAttributes().keySet().stream().filter(a -> !assertedUserAttributes.contains(a)).forEach(a -> user.removeAttribute(a));
192  }
void setIfNotEmpty(Consumer< String > consumer, List< String > values)
Definition: UserAttributeStatementMapper.java:214
static final String USER_ATTRIBUTE_EMAIL
Definition: UserAttributeStatementMapper.java:48
static final String USER_ATTR_LOCALE
Definition: UserAttributeStatementMapper.java:36
static final String USER_ATTRIBUTE_FIRST_NAME
Definition: UserAttributeStatementMapper.java:44
static final String USER_ATTRIBUTE_LANGUAGE
Definition: UserAttributeStatementMapper.java:50
Optional< Pattern > getAttributePattern(IdentityProviderMapperModel mapperModel)
Definition: UserAttributeStatementMapper.java:199
List< AttributeType > findAttributesInContext(BrokeredIdentityContext context, Optional< Pattern > attributePattern)
Definition: UserAttributeStatementMapper.java:204
static final String USE_FRIENDLY_NAMES
Definition: UserAttributeStatementMapper.java:52
static final String USER_ATTRIBUTE_LAST_NAME
Definition: UserAttributeStatementMapper.java:46

メンバ詳解

◆ ATTRIBUTE_NAME_PATTERN

final String org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.ATTRIBUTE_NAME_PATTERN = "attribute.name.pattern"
static

◆ COMPATIBLE_PROVIDERS

final String [] org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.COMPATIBLE_PROVIDERS = {SAMLIdentityProviderFactory.PROVIDER_ID}
staticprivate

◆ CONFIG_PROPERTIES

final List<ProviderConfigProperty> org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.CONFIG_PROPERTIES = new ArrayList<>()
staticprivate

◆ PROVIDER_ID

final String org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.PROVIDER_ID = "saml-user-attributestatement-idp-mapper"
static

◆ USE_FRIENDLY_NAMES

final String org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.USE_FRIENDLY_NAMES = "use.friendly.names"
staticprivate

◆ USER_ATTR_LOCALE

final String org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.USER_ATTR_LOCALE = "locale"
staticprivate

◆ USER_ATTRIBUTE_EMAIL

final String org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.USER_ATTRIBUTE_EMAIL = "user.attribute.email"
static

◆ USER_ATTRIBUTE_FIRST_NAME

final String org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.USER_ATTRIBUTE_FIRST_NAME = "user.attribute.firstName"
static

◆ USER_ATTRIBUTE_LANGUAGE

final String org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.USER_ATTRIBUTE_LANGUAGE = "user.attribute.language"
static

◆ USER_ATTRIBUTE_LAST_NAME

final String org.keycloak.broker.saml.mappers.UserAttributeStatementMapper.USER_ATTRIBUTE_LAST_NAME = "user.attribute.lastName"
static

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