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

公開メンバ関数

 PasswordCredentialProvider (KeycloakSession session)
 
CredentialModel getPassword (RealmModel realm, UserModel user)
 
boolean updateCredential (RealmModel realm, UserModel user, CredentialInput input)
 
void disableCredentialType (RealmModel realm, UserModel user, String credentialType)
 
Set< String > getDisableableCredentialTypes (RealmModel realm, UserModel user)
 
boolean supportsCredentialType (String credentialType)
 
boolean isConfiguredFor (RealmModel realm, UserModel user, String credentialType)
 
boolean isValid (RealmModel realm, UserModel user, CredentialInput input)
 
void onCache (RealmModel realm, CachedUserModel user, UserModel delegate)
 

静的公開変数類

static final String PASSWORD_CACHE_KEY = PasswordCredentialProvider.class.getName() + "." + CredentialModel.PASSWORD
 

限定公開メンバ関数

UserCredentialStore getCredentialStore ()
 
void expirePassword (RealmModel realm, UserModel user, PasswordPolicy policy)
 
PasswordHashProvider getHashProvider (PasswordPolicy policy)
 

限定公開変数類

KeycloakSession session
 

静的非公開変数類

static final Logger logger = Logger.getLogger(PasswordCredentialProvider.class)
 

詳解

著者
Bill Burke
バージョン
Revision
1

構築子と解体子

◆ PasswordCredentialProvider()

org.keycloak.credential.PasswordCredentialProvider.PasswordCredentialProvider ( KeycloakSession  session)
inline
50  {
51  this.session = session;
52  }
KeycloakSession session
Definition: PasswordCredentialProvider.java:48

関数詳解

◆ disableCredentialType()

void org.keycloak.credential.PasswordCredentialProvider.disableCredentialType ( RealmModel  realm,
UserModel  user,
String  credentialType 
)
inline
147  {
148  if (!supportsCredentialType(credentialType)) return;
149  PasswordPolicy policy = realm.getPasswordPolicy();
150  expirePassword(realm, user, policy);
151  }
void expirePassword(RealmModel realm, UserModel user, PasswordPolicy policy)
Definition: PasswordCredentialProvider.java:109
boolean supportsCredentialType(String credentialType)
Definition: PasswordCredentialProvider.java:165

◆ expirePassword()

void org.keycloak.credential.PasswordCredentialProvider.expirePassword ( RealmModel  realm,
UserModel  user,
PasswordPolicy  policy 
)
inlineprotected
109  {
110 
111  CredentialModel oldPassword = getPassword(realm, user);
112  if (oldPassword == null) return;
113  int expiredPasswordsPolicyValue = policy.getExpiredPasswords();
114  if (expiredPasswordsPolicyValue > 1) {
115  List<CredentialModel> list = getCredentialStore().getStoredCredentialsByType(realm, user, CredentialModel.PASSWORD_HISTORY);
116  // oldPassword will expire few lines below, and there is one active password,
117  // hence (expiredPasswordsPolicyValue - 2) passwords should be left in history
118  final int passwordsToLeave = expiredPasswordsPolicyValue - 2;
119  if (list.size() > passwordsToLeave) {
120  list.stream()
121  .sorted((o1, o2) -> { // sort by date descending
122  Long o1Date = o1.getCreatedDate() == null ? Long.MIN_VALUE : o1.getCreatedDate();
123  Long o2Date = o2.getCreatedDate() == null ? Long.MIN_VALUE : o2.getCreatedDate();
124  return (- o1Date.compareTo(o2Date));
125  })
126  .skip(passwordsToLeave)
127  .forEach(p -> getCredentialStore().removeStoredCredential(realm, user, p.getId()));
128  }
129  oldPassword.setType(CredentialModel.PASSWORD_HISTORY);
130  getCredentialStore().updateCredential(realm, user, oldPassword);
131  } else {
132  session.userCredentialManager().removeStoredCredential(realm, user, oldPassword.getId());
133  }
134 
135  }
KeycloakSession session
Definition: PasswordCredentialProvider.java:48
UserCredentialStore getCredentialStore()
Definition: PasswordCredentialProvider.java:54
CredentialModel getPassword(RealmModel realm, UserModel user)
Definition: PasswordCredentialProvider.java:58

◆ getCredentialStore()

UserCredentialStore org.keycloak.credential.PasswordCredentialProvider.getCredentialStore ( )
inlineprotected
54  {
55  return session.userCredentialManager();
56  }
KeycloakSession session
Definition: PasswordCredentialProvider.java:48

◆ getDisableableCredentialTypes()

Set<String> org.keycloak.credential.PasswordCredentialProvider.getDisableableCredentialTypes ( RealmModel  realm,
UserModel  user 
)
inline
154  {
155  if (!getCredentialStore().getStoredCredentialsByType(realm, user, CredentialModel.PASSWORD).isEmpty()) {
156  Set<String> set = new HashSet<>();
157  set.add(CredentialModel.PASSWORD);
158  return set;
159  } else {
160  return Collections.EMPTY_SET;
161  }
162  }
UserCredentialStore getCredentialStore()
Definition: PasswordCredentialProvider.java:54

◆ getHashProvider()

PasswordHashProvider org.keycloak.credential.PasswordCredentialProvider.getHashProvider ( PasswordPolicy  policy)
inlineprotected
137  {
138  PasswordHashProvider hash = session.getProvider(PasswordHashProvider.class, policy.getHashAlgorithm());
139  if (hash == null) {
140  logger.warnv("Realm PasswordPolicy PasswordHashProvider {0} not found", policy.getHashAlgorithm());
141  return session.getProvider(PasswordHashProvider.class, PasswordPolicy.HASH_ALGORITHM_DEFAULT);
142  }
143  return hash;
144  }
KeycloakSession session
Definition: PasswordCredentialProvider.java:48
static final Logger logger
Definition: PasswordCredentialProvider.java:46

◆ getPassword()

CredentialModel org.keycloak.credential.PasswordCredentialProvider.getPassword ( RealmModel  realm,
UserModel  user 
)
inline
58  {
59  List<CredentialModel> passwords = null;
60  if (user instanceof CachedUserModel && !((CachedUserModel)user).isMarkedForEviction()) {
61  CachedUserModel cached = (CachedUserModel)user;
62  passwords = (List<CredentialModel>)cached.getCachedWith().get(PASSWORD_CACHE_KEY);
63 
64  }
65  // if the model was marked for eviction while passwords were initialized, override it from credentialStore
66  if (! (user instanceof CachedUserModel) || ((CachedUserModel) user).isMarkedForEviction()) {
67  passwords = getCredentialStore().getStoredCredentialsByType(realm, user, CredentialModel.PASSWORD);
68  }
69  if (passwords == null || passwords.isEmpty()) return null;
70  return passwords.get(0);
71  }
static final String PASSWORD_CACHE_KEY
Definition: PasswordCredentialProvider.java:45
UserCredentialStore getCredentialStore()
Definition: PasswordCredentialProvider.java:54

◆ isConfiguredFor()

boolean org.keycloak.credential.PasswordCredentialProvider.isConfiguredFor ( RealmModel  realm,
UserModel  user,
String  credentialType 
)
inline
170  {
171  return getPassword(realm, user) != null;
172  }
CredentialModel getPassword(RealmModel realm, UserModel user)
Definition: PasswordCredentialProvider.java:58

◆ isValid()

boolean org.keycloak.credential.PasswordCredentialProvider.isValid ( RealmModel  realm,
UserModel  user,
CredentialInput  input 
)
inline
175  {
176  if (! (input instanceof UserCredentialModel)) {
177  logger.debug("Expected instance of UserCredentialModel for CredentialInput");
178  return false;
179 
180  }
181  UserCredentialModel cred = (UserCredentialModel)input;
182  if (cred.getValue() == null) {
183  logger.debugv("Input password was null for user {0} ", user.getUsername());
184  return false;
185  }
186  CredentialModel password = getPassword(realm, user);
187  if (password == null) {
188  logger.debugv("No password cached or stored for user {0} ", user.getUsername());
189  return false;
190  }
191  PasswordHashProvider hash = session.getProvider(PasswordHashProvider.class, password.getAlgorithm());
192  if (hash == null) {
193  logger.debugv("PasswordHashProvider {0} not found for user {1} ", password.getAlgorithm(), user.getUsername());
194  return false;
195  }
196  if (!hash.verify(cred.getValue(), password)) {
197  logger.debugv("Failed password validation for user {0} ", user.getUsername());
198  return false;
199  }
200  PasswordPolicy policy = realm.getPasswordPolicy();
201  if (policy == null) {
202  return true;
203  }
204  hash = getHashProvider(policy);
205  if (hash == null) {
206  return true;
207  }
208  if (hash.policyCheck(policy, password)) {
209  return true;
210  }
211 
212  CredentialModel newPassword = password.shallowClone();
213  hash.encode(cred.getValue(), policy.getHashIterations(), newPassword);
214  getCredentialStore().updateCredential(realm, user, newPassword);
215 
216  UserCache userCache = session.userCache();
217  if (userCache != null) {
218  userCache.evict(realm, user);
219  }
220 
221  return true;
222  }
KeycloakSession session
Definition: PasswordCredentialProvider.java:48
UserCredentialStore getCredentialStore()
Definition: PasswordCredentialProvider.java:54
static final Logger logger
Definition: PasswordCredentialProvider.java:46
PasswordHashProvider getHashProvider(PasswordPolicy policy)
Definition: PasswordCredentialProvider.java:137
CredentialModel getPassword(RealmModel realm, UserModel user)
Definition: PasswordCredentialProvider.java:58

◆ onCache()

void org.keycloak.credential.PasswordCredentialProvider.onCache ( RealmModel  realm,
CachedUserModel  user,
UserModel  delegate 
)
inline
225  {
226  List<CredentialModel> passwords = getCredentialStore().getStoredCredentialsByType(realm, user, CredentialModel.PASSWORD);
227  if (passwords != null) {
228  user.getCachedWith().put(PASSWORD_CACHE_KEY, passwords);
229  }
230 
231  }
static final String PASSWORD_CACHE_KEY
Definition: PasswordCredentialProvider.java:45
UserCredentialStore getCredentialStore()
Definition: PasswordCredentialProvider.java:54

◆ supportsCredentialType()

boolean org.keycloak.credential.PasswordCredentialProvider.supportsCredentialType ( String  credentialType)
inline
165  {
166  return credentialType.equals(CredentialModel.PASSWORD);
167  }

◆ updateCredential()

boolean org.keycloak.credential.PasswordCredentialProvider.updateCredential ( RealmModel  realm,
UserModel  user,
CredentialInput  input 
)
inline
75  {
76  if (!supportsCredentialType(input.getType())) return false;
77 
78  if (!(input instanceof UserCredentialModel)) {
79  logger.debug("Expected instance of UserCredentialModel for CredentialInput");
80  return false;
81  }
82  UserCredentialModel cred = (UserCredentialModel)input;
83  PasswordPolicy policy = realm.getPasswordPolicy();
84 
85  PolicyError error = session.getProvider(PasswordPolicyManagerProvider.class).validate(realm, user, cred.getValue());
86  if (error != null) throw new ModelException(error.getMessage(), error.getParameters());
87 
88 
89  PasswordHashProvider hash = getHashProvider(policy);
90  if (hash == null) {
91  return false;
92  }
93  CredentialModel oldPassword = getPassword(realm, user);
94 
95  expirePassword(realm, user, policy);
96  CredentialModel newPassword = new CredentialModel();
97  newPassword.setType(CredentialModel.PASSWORD);
98  long createdDate = Time.currentTimeMillis();
99  newPassword.setCreatedDate(createdDate);
100  hash.encode(cred.getValue(), policy.getHashIterations(), newPassword);
101  getCredentialStore().createCredential(realm, user, newPassword);
102  UserCache userCache = session.userCache();
103  if (userCache != null) {
104  userCache.evict(realm, user);
105  }
106  return true;
107  }
KeycloakSession session
Definition: PasswordCredentialProvider.java:48
UserCredentialStore getCredentialStore()
Definition: PasswordCredentialProvider.java:54
void expirePassword(RealmModel realm, UserModel user, PasswordPolicy policy)
Definition: PasswordCredentialProvider.java:109
static final Logger logger
Definition: PasswordCredentialProvider.java:46
PasswordHashProvider getHashProvider(PasswordPolicy policy)
Definition: PasswordCredentialProvider.java:137
boolean supportsCredentialType(String credentialType)
Definition: PasswordCredentialProvider.java:165
CredentialModel getPassword(RealmModel realm, UserModel user)
Definition: PasswordCredentialProvider.java:58

メンバ詳解

◆ logger

final Logger org.keycloak.credential.PasswordCredentialProvider.logger = Logger.getLogger(PasswordCredentialProvider.class)
staticprivate

◆ PASSWORD_CACHE_KEY

final String org.keycloak.credential.PasswordCredentialProvider.PASSWORD_CACHE_KEY = PasswordCredentialProvider.class.getName() + "." + CredentialModel.PASSWORD
static

◆ session

KeycloakSession org.keycloak.credential.PasswordCredentialProvider.session
protected

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