keycloak
クラス | 公開メンバ関数 | 静的公開メンバ関数 | 静的公開変数類 | 限定公開メンバ関数 | 限定公開変数類 | 静的非公開変数類 | 全メンバ一覧
org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper クラス
org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper の継承関係図
Inheritance graph
org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper 連携図
Collaboration graph

クラス

class  MSADUserModelDelegate
 

公開メンバ関数

 MSADUserAccountControlStorageMapper (ComponentModel mapperModel, LDAPStorageProvider ldapProvider)
 
void beforeLDAPQuery (LDAPQuery query)
 
LDAPOperationDecorator beforePasswordUpdate (UserModel user, LDAPObject ldapUser, PasswordUserCredentialModel password)
 
void passwordUpdated (UserModel user, LDAPObject ldapUser, PasswordUserCredentialModel password)
 
void passwordUpdateFailed (UserModel user, LDAPObject ldapUser, PasswordUserCredentialModel password, ModelException exception)
 
UserModel proxy (LDAPObject ldapUser, UserModel delegate, RealmModel realm)
 
void onRegisterUserToLDAP (LDAPObject ldapUser, UserModel localUser, RealmModel realm)
 
void onImportUserFromLDAP (LDAPObject ldapUser, UserModel user, RealmModel realm, boolean isCreate)
 
boolean onAuthenticationFailure (LDAPObject ldapUser, UserModel user, AuthenticationException ldapException, RealmModel realm)
 
SynchronizationResult syncDataFromFederationProviderToKeycloak (RealmModel realm)
 
SynchronizationResult syncDataFromKeycloakToFederationProvider (RealmModel realm)
 
List< UserModelgetGroupMembers (RealmModel realm, GroupModel group, int firstResult, int maxResults)
 
LDAPStorageProvider getLdapProvider ()
 
void close ()
 

静的公開メンバ関数

static boolean parseBooleanParameter (ComponentModel mapperModel, String paramName)
 

静的公開変数類

static final String LDAP_PASSWORD_POLICY_HINTS_ENABLED = "ldap.password.policy.hints.enabled"
 

限定公開メンバ関数

boolean processAuthErrorCode (String errorCode, UserModel user)
 
ModelException processFailedPasswordUpdateException (ModelException e)
 
UserAccountControl getUserAccountControl (LDAPObject ldapUser)
 
void updateUserAccountControl (boolean updateInLDAP, LDAPObject ldapUser, UserAccountControl accountControl)
 

限定公開変数類

final KeycloakSession session
 
final ComponentModel mapperModel
 
final LDAPStorageProvider ldapProvider
 

静的非公開変数類

static final Logger logger = Logger.getLogger(MSADUserAccountControlStorageMapper.class)
 
static final Pattern AUTH_EXCEPTION_REGEX = Pattern.compile(".*AcceptSecurityContext error, data ([0-9a-f]*), v.*")
 
static final Pattern AUTH_INVALID_NEW_PASSWORD = Pattern.compile(".*ERROR CODE ([0-9A-F]+) - ([0-9A-F]+): .*WILL_NOT_PERFORM.*")
 

詳解

Mapper specific to MSAD. It's able to read the userAccountControl and pwdLastSet attributes and set actions in Keycloak based on that. It's also able to handle exception code from LDAP user authentication (See http://www-01.ibm.com/support/docview.wss?uid=swg21290631 )

著者
Marek Posolda

構築子と解体子

◆ MSADUserAccountControlStorageMapper()

org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.MSADUserAccountControlStorageMapper ( ComponentModel  mapperModel,
LDAPStorageProvider  ldapProvider 
)
inline
59  {
60  super(mapperModel, ldapProvider);
62  }
final ComponentModel mapperModel
Definition: AbstractLDAPStorageMapper.java:43
void setUpdater(PasswordUpdateCallback updater)
Definition: LDAPStorageProvider.java:118
final LDAPStorageProvider ldapProvider
Definition: AbstractLDAPStorageMapper.java:44

関数詳解

◆ beforeLDAPQuery()

void org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.beforeLDAPQuery ( LDAPQuery  query)
inline

org.keycloak.storage.ldap.mappers.LDAPStorageMapperを実装しています。

65  {
66  query.addReturningLdapAttribute(LDAPConstants.PWD_LAST_SET);
67  query.addReturningLdapAttribute(LDAPConstants.USER_ACCOUNT_CONTROL);
68 
69  // This needs to be read-only and can be set to writable just on demand
70  query.addReturningReadOnlyLdapAttribute(LDAPConstants.PWD_LAST_SET);
71 
72  if (ldapProvider.getEditMode() != UserStorageProvider.EditMode.WRITABLE) {
73  query.addReturningReadOnlyLdapAttribute(LDAPConstants.USER_ACCOUNT_CONTROL);
74  }
75  }
EditMode getEditMode()
Definition: LDAPStorageProvider.java:130
final LDAPStorageProvider ldapProvider
Definition: AbstractLDAPStorageMapper.java:44
WRITABLE
Definition: UserStorageProvider.java:80

◆ beforePasswordUpdate()

LDAPOperationDecorator org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.beforePasswordUpdate ( UserModel  user,
LDAPObject  ldapUser,
PasswordUserCredentialModel  password 
)
inline

org.keycloak.storage.ldap.mappers.PasswordUpdateCallbackを実装しています。

78  {
79  // Not apply policies if password is reset by admin (not by user himself)
80  if (password.isAdminRequest()) {
81  return null;
82  }
83 
84  boolean applyDecorator = mapperModel.get(LDAP_PASSWORD_POLICY_HINTS_ENABLED, false);
85  return applyDecorator ? new LDAPServerPolicyHintsDecorator() : null;
86  }
final ComponentModel mapperModel
Definition: AbstractLDAPStorageMapper.java:43
String get(String key)
Definition: ComponentModel.java:83
static final String LDAP_PASSWORD_POLICY_HINTS_ENABLED
Definition: MSADUserAccountControlStorageMapper.java:52

◆ close()

void org.keycloak.storage.ldap.mappers.AbstractLDAPStorageMapper.close ( )
inlineinherited

org.keycloak.provider.Providerを実装しています。

85  {
86 
87  }

◆ getGroupMembers()

List<UserModel> org.keycloak.storage.ldap.mappers.AbstractLDAPStorageMapper.getGroupMembers ( RealmModel  realm,
GroupModel  group,
int  firstResult,
int  maxResults 
)
inlineinherited

org.keycloak.storage.ldap.mappers.LDAPStorageMapperを実装しています。

63  {
64  return Collections.emptyList();
65  }

◆ getLdapProvider()

LDAPStorageProvider org.keycloak.storage.ldap.mappers.AbstractLDAPStorageMapper.getLdapProvider ( )
inlineinherited
79  {
80  return ldapProvider;
81  }
final LDAPStorageProvider ldapProvider
Definition: AbstractLDAPStorageMapper.java:44

◆ getUserAccountControl()

UserAccountControl org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.getUserAccountControl ( LDAPObject  ldapUser)
inlineprotected
189  {
190  String userAccountControl = ldapUser.getAttributeAsString(LDAPConstants.USER_ACCOUNT_CONTROL);
191  long longValue = userAccountControl == null ? 0 : Long.parseLong(userAccountControl);
192  return new UserAccountControl(longValue);
193  }

◆ onAuthenticationFailure()

boolean org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.onAuthenticationFailure ( LDAPObject  ldapUser,
UserModel  user,
AuthenticationException  ldapException,
RealmModel  realm 
)
inline

org.keycloak.storage.ldap.mappers.LDAPStorageMapperを実装しています。

129  {
130  String exceptionMessage = ldapException.getMessage();
131  Matcher m = AUTH_EXCEPTION_REGEX.matcher(exceptionMessage);
132  if (m.matches()) {
133  String errorCode = m.group(1);
134  return processAuthErrorCode(errorCode, user);
135  } else {
136  return false;
137  }
138  }
static final Pattern AUTH_EXCEPTION_REGEX
Definition: MSADUserAccountControlStorageMapper.java:56
boolean processAuthErrorCode(String errorCode, UserModel user)
Definition: MSADUserAccountControlStorageMapper.java:140

◆ onImportUserFromLDAP()

void org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.onImportUserFromLDAP ( LDAPObject  ldapUser,
UserModel  user,
RealmModel  realm,
boolean  isCreate 
)
inline

org.keycloak.storage.ldap.mappers.LDAPStorageMapperを実装しています。

124  {
125 
126  }

◆ onRegisterUserToLDAP()

void org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.onRegisterUserToLDAP ( LDAPObject  ldapUser,
UserModel  localUser,
RealmModel  realm 
)
inline

org.keycloak.storage.ldap.mappers.LDAPStorageMapperを実装しています。

119  {
120 
121  }

◆ parseBooleanParameter()

static boolean org.keycloak.storage.ldap.mappers.AbstractLDAPStorageMapper.parseBooleanParameter ( ComponentModel  mapperModel,
String  paramName 
)
inlinestaticinherited
73  {
74  String paramm = mapperModel.getConfig().getFirst(paramName);
75  return Boolean.parseBoolean(paramm);
76  }
final ComponentModel mapperModel
Definition: AbstractLDAPStorageMapper.java:43
V getFirst(K key)
Definition: MultivaluedHashMap.java:86
MultivaluedHashMap< String, String > getConfig()
Definition: ComponentModel.java:71

◆ passwordUpdated()

void org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.passwordUpdated ( UserModel  user,
LDAPObject  ldapUser,
PasswordUserCredentialModel  password 
)
inline

org.keycloak.storage.ldap.mappers.PasswordUpdateCallbackを実装しています。

89  {
90  logger.debugf("Going to update userAccountControl for ldap user '%s' after successful password update", ldapUser.getDn().toString());
91 
92  // Normally it's read-only
93  ldapUser.removeReadOnlyAttributeName(LDAPConstants.PWD_LAST_SET);
94 
95  ldapUser.setSingleAttribute(LDAPConstants.PWD_LAST_SET, "-1");
96 
97  UserAccountControl control = getUserAccountControl(ldapUser);
98  control.remove(UserAccountControl.PASSWD_NOTREQD);
99  control.remove(UserAccountControl.PASSWORD_EXPIRED);
100 
101  if (user.isEnabled()) {
102  control.remove(UserAccountControl.ACCOUNTDISABLE);
103  }
104 
105  updateUserAccountControl(true, ldapUser, control);
106  }
void updateUserAccountControl(boolean updateInLDAP, LDAPObject ldapUser, UserAccountControl accountControl)
Definition: MSADUserAccountControlStorageMapper.java:196
UserAccountControl getUserAccountControl(LDAPObject ldapUser)
Definition: MSADUserAccountControlStorageMapper.java:189
static final Logger logger
Definition: MSADUserAccountControlStorageMapper.java:54

◆ passwordUpdateFailed()

void org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.passwordUpdateFailed ( UserModel  user,
LDAPObject  ldapUser,
PasswordUserCredentialModel  password,
ModelException  exception 
)
inline

org.keycloak.storage.ldap.mappers.PasswordUpdateCallbackを実装しています。

109  {
110  throw processFailedPasswordUpdateException(exception);
111  }
ModelException processFailedPasswordUpdateException(ModelException e)
Definition: MSADUserAccountControlStorageMapper.java:165

◆ processAuthErrorCode()

boolean org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.processAuthErrorCode ( String  errorCode,
UserModel  user 
)
inlineprotected
140  {
141  logger.debugf("MSAD Error code is '%s' after failed LDAP login of user '%s'", errorCode, user.getUsername());
142 
143  if (ldapProvider.getEditMode() == UserStorageProvider.EditMode.WRITABLE) {
144  if (errorCode.equals("532") || errorCode.equals("773")) {
145  // User needs to change his MSAD password. Allow him to login, but add UPDATE_PASSWORD required action
146  if (!user.getRequiredActions().contains(UserModel.RequiredAction.UPDATE_PASSWORD.name())) {
147  user.addRequiredAction(UserModel.RequiredAction.UPDATE_PASSWORD);
148  }
149  return true;
150  } else if (errorCode.equals("533")) {
151  // User is disabled in MSAD. Set him to disabled in KC as well
152  if (user.isEnabled()) {
153  user.setEnabled(false);
154  }
155  return true;
156  } else if (errorCode.equals("775")) {
157  logger.warnf("Locked user '%s' attempt to login", user.getUsername());
158  }
159  }
160 
161  return false;
162  }
EditMode getEditMode()
Definition: LDAPStorageProvider.java:130
final LDAPStorageProvider ldapProvider
Definition: AbstractLDAPStorageMapper.java:44
WRITABLE
Definition: UserStorageProvider.java:80
static final Logger logger
Definition: MSADUserAccountControlStorageMapper.java:54

◆ processFailedPasswordUpdateException()

ModelException org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.processFailedPasswordUpdateException ( ModelException  e)
inlineprotected
165  {
166  if (e.getCause() == null || e.getCause().getMessage() == null) {
167  return e;
168  }
169 
170  String exceptionMessage = e.getCause().getMessage().replace('\n', ' ');
171  logger.debugf("Failed to update password in Active Directory. Exception message: %s", exceptionMessage);
172  exceptionMessage = exceptionMessage.toUpperCase();
173 
174  Matcher m = AUTH_INVALID_NEW_PASSWORD.matcher(exceptionMessage);
175  if (m.matches()) {
176  String errorCode = m.group(1);
177  String errorCode2 = m.group(2);
178 
179  // 52D corresponds to ERROR_PASSWORD_RESTRICTION. See https://msdn.microsoft.com/en-us/library/windows/desktop/ms681385(v=vs.85).aspx
180  if ((errorCode.equals("53")) && errorCode2.endsWith("52D")) {
181  ModelException me = new ModelException("invalidPasswordGenericMessage", e);
182  return me;
183  }
184  }
185 
186  return e;
187  }
static final Logger logger
Definition: MSADUserAccountControlStorageMapper.java:54
static final Pattern AUTH_INVALID_NEW_PASSWORD
Definition: MSADUserAccountControlStorageMapper.java:57

◆ proxy()

UserModel org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.proxy ( LDAPObject  ldapUser,
UserModel  delegate,
RealmModel  realm 
)
inline

org.keycloak.storage.ldap.mappers.LDAPStorageMapperを実装しています。

114  {
115  return new MSADUserModelDelegate(delegate, ldapUser);
116  }

◆ syncDataFromFederationProviderToKeycloak()

SynchronizationResult org.keycloak.storage.ldap.mappers.AbstractLDAPStorageMapper.syncDataFromFederationProviderToKeycloak ( RealmModel  realm)
inlineinherited

org.keycloak.storage.ldap.mappers.LDAPStorageMapperを実装しています。

53  {
54  return new SynchronizationResult();
55  }

◆ syncDataFromKeycloakToFederationProvider()

SynchronizationResult org.keycloak.storage.ldap.mappers.AbstractLDAPStorageMapper.syncDataFromKeycloakToFederationProvider ( RealmModel  realm)
inlineinherited

org.keycloak.storage.ldap.mappers.LDAPStorageMapperを実装しています。

58  {
59  return new SynchronizationResult();
60  }

◆ updateUserAccountControl()

void org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.updateUserAccountControl ( boolean  updateInLDAP,
LDAPObject  ldapUser,
UserAccountControl  accountControl 
)
inlineprotected
196  {
197  String userAccountControlValue = String.valueOf(accountControl.getValue());
198  logger.debugf("Updating userAccountControl of user '%s' to value '%s'", ldapUser.getDn().toString(), userAccountControlValue);
199 
200  ldapUser.setSingleAttribute(LDAPConstants.USER_ACCOUNT_CONTROL, userAccountControlValue);
201 
202  if (updateInLDAP) {
204  }
205  }
LDAPIdentityStore getLdapIdentityStore()
Definition: LDAPStorageProvider.java:126
void update(LDAPObject ldapObject)
Definition: LDAPIdentityStore.java:105
final LDAPStorageProvider ldapProvider
Definition: AbstractLDAPStorageMapper.java:44
static final Logger logger
Definition: MSADUserAccountControlStorageMapper.java:54

メンバ詳解

◆ AUTH_EXCEPTION_REGEX

final Pattern org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.AUTH_EXCEPTION_REGEX = Pattern.compile(".*AcceptSecurityContext error, data ([0-9a-f]*), v.*")
staticprivate

◆ AUTH_INVALID_NEW_PASSWORD

final Pattern org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.AUTH_INVALID_NEW_PASSWORD = Pattern.compile(".*ERROR CODE ([0-9A-F]+) - ([0-9A-F]+): .*WILL_NOT_PERFORM.*")
staticprivate

◆ LDAP_PASSWORD_POLICY_HINTS_ENABLED

final String org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.LDAP_PASSWORD_POLICY_HINTS_ENABLED = "ldap.password.policy.hints.enabled"
static

◆ ldapProvider

final LDAPStorageProvider org.keycloak.storage.ldap.mappers.AbstractLDAPStorageMapper.ldapProvider
protectedinherited

◆ logger

final Logger org.keycloak.storage.ldap.mappers.msad.MSADUserAccountControlStorageMapper.logger = Logger.getLogger(MSADUserAccountControlStorageMapper.class)
staticprivate

◆ mapperModel

final ComponentModel org.keycloak.storage.ldap.mappers.AbstractLDAPStorageMapper.mapperModel
protectedinherited

◆ session

final KeycloakSession org.keycloak.storage.ldap.mappers.AbstractLDAPStorageMapper.session
protectedinherited

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