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

公開メンバ関数

 KerberosFederationProvider (KeycloakSession session, UserStorageProviderModel model, KerberosFederationProviderFactory factory)
 
UserModel validate (RealmModel realm, UserModel user)
 
UserModel getUserByUsername (String username, RealmModel realm)
 
UserModel getUserByEmail (String email, RealmModel realm)
 
UserModel getUserById (String id, RealmModel realm)
 
void preRemove (RealmModel realm)
 
void preRemove (RealmModel realm, RoleModel role)
 
void preRemove (RealmModel realm, GroupModel group)
 
boolean isValid (RealmModel realm, UserModel local)
 
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 supportsCredentialAuthenticationFor (String type)
 
boolean isConfiguredFor (RealmModel realm, UserModel user, String credentialType)
 
boolean isValid (RealmModel realm, UserModel user, CredentialInput input)
 
CredentialValidationOutput authenticate (RealmModel realm, CredentialInput input)
 
void close ()
 

静的公開変数類

static final String KERBEROS_PRINCIPAL = "KERBEROS_PRINCIPAL"
 

限定公開メンバ関数

boolean validPassword (String username, String password)
 
UserModel findOrCreateAuthenticatedUser (RealmModel realm, String username)
 
UserModel importUserToKeycloak (RealmModel realm, String username)
 

限定公開変数類

KeycloakSession session
 
UserStorageProviderModel model
 
KerberosConfig kerberosConfig
 
KerberosFederationProviderFactory factory
 

静的非公開変数類

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

詳解

著者
Marek Posolda

構築子と解体子

◆ KerberosFederationProvider()

org.keycloak.federation.kerberos.KerberosFederationProvider.KerberosFederationProvider ( KeycloakSession  session,
UserStorageProviderModel  model,
KerberosFederationProviderFactory  factory 
)
inline
66  {
67  this.session = session;
68  this.model = model;
69  this.kerberosConfig = new KerberosConfig(model);
70  this.factory = factory;
71  }
KerberosFederationProviderFactory factory
Definition: KerberosFederationProvider.java:64
KeycloakSession session
Definition: KerberosFederationProvider.java:61
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63
UserStorageProviderModel model
Definition: KerberosFederationProvider.java:62

関数詳解

◆ authenticate()

CredentialValidationOutput org.keycloak.federation.kerberos.KerberosFederationProvider.authenticate ( RealmModel  realm,
CredentialInput  input 
)
inline

org.keycloak.credential.CredentialAuthenticationを実装しています。

187  {
188  if (!(input instanceof UserCredentialModel)) return null;
189  UserCredentialModel credential = (UserCredentialModel)input;
190  if (credential.getType().equals(UserCredentialModel.KERBEROS)) {
191  String spnegoToken = credential.getValue();
192  SPNEGOAuthenticator spnegoAuthenticator = factory.createSPNEGOAuthenticator(spnegoToken, kerberosConfig);
193 
194  spnegoAuthenticator.authenticate();
195 
196  Map<String, String> state = new HashMap<String, String>();
197  if (spnegoAuthenticator.isAuthenticated()) {
198  String username = spnegoAuthenticator.getAuthenticatedUsername();
199  UserModel user = findOrCreateAuthenticatedUser(realm, username);
200  if (user == null) {
201  return CredentialValidationOutput.failed();
202  } else {
203  String delegationCredential = spnegoAuthenticator.getSerializedDelegationCredential();
204  if (delegationCredential != null) {
205  state.put(KerberosConstants.GSS_DELEGATION_CREDENTIAL, delegationCredential);
206  }
207 
208  return new CredentialValidationOutput(user, CredentialValidationOutput.Status.AUTHENTICATED, state);
209  }
210  } else {
211  state.put(KerberosConstants.RESPONSE_TOKEN, spnegoAuthenticator.getResponseToken());
212  return new CredentialValidationOutput(null, CredentialValidationOutput.Status.CONTINUE, state);
213  }
214 
215  } else {
216  return null;
217  }
218  }
void authenticate()
Definition: SPNEGOAuthenticator.java:61
KerberosFederationProviderFactory factory
Definition: KerberosFederationProvider.java:64
UserModel findOrCreateAuthenticatedUser(RealmModel realm, String username)
Definition: KerberosFederationProvider.java:232
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63
SPNEGOAuthenticator createSPNEGOAuthenticator(String spnegoToken, CommonKerberosConfig kerberosConfig)
Definition: KerberosFederationProviderFactory.java:134

◆ close()

void org.keycloak.federation.kerberos.KerberosFederationProvider.close ( )
inline

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

221  {
222 
223  }

◆ disableCredentialType()

void org.keycloak.federation.kerberos.KerberosFederationProvider.disableCredentialType ( RealmModel  realm,
UserModel  user,
String  credentialType 
)
inline

org.keycloak.credential.CredentialInputUpdaterを実装しています。

143  {
144 
145  }

◆ findOrCreateAuthenticatedUser()

UserModel org.keycloak.federation.kerberos.KerberosFederationProvider.findOrCreateAuthenticatedUser ( RealmModel  realm,
String  username 
)
inlineprotected

Called after successful authentication

引数
realmrealm
usernameusername without realm prefix
戻り値
user if found or successfully created. Null if user with same username already exists, but is not linked to this provider
232  {
233  UserModel user = session.userLocalStorage().getUserByUsername(username, realm);
234  if (user != null) {
235  user = session.users().getUserById(user.getId(), realm); // make sure we get a cached instance
236  logger.debug("Kerberos authenticated user " + username + " found in Keycloak storage");
237 
238  if (!model.getId().equals(user.getFederationLink())) {
239  logger.warn("User with username " + username + " already exists, but is not linked to provider [" + model.getName() + "]");
240  return null;
241  } else {
242  UserModel proxied = validate(realm, user);
243  if (proxied != null) {
244  return proxied;
245  } else {
246  logger.warn("User with username " + username + " already exists and is linked to provider [" + model.getName() +
247  "] but kerberos principal is not correct. Kerberos principal on user is: " + user.getFirstAttribute(KERBEROS_PRINCIPAL));
248  logger.warn("Will re-create user");
249  new UserManager(session).removeUser(realm, user, session.userLocalStorage());
250  }
251  }
252  }
253 
254  logger.debug("Kerberos authenticated user " + username + " not in Keycloak storage. Creating him");
255  return importUserToKeycloak(realm, username);
256  }
static final String KERBEROS_PRINCIPAL
Definition: KerberosFederationProvider.java:59
UserModel validate(RealmModel realm, UserModel user)
Definition: KerberosFederationProvider.java:74
String getId()
Definition: ComponentModel.java:55
static final Logger logger
Definition: KerberosFederationProvider.java:58
KeycloakSession session
Definition: KerberosFederationProvider.java:61
UserModel importUserToKeycloak(RealmModel realm, String username)
Definition: KerberosFederationProvider.java:258
UserModel getUserById(String id, RealmModel realm)
UserModel getUserByUsername(String username, RealmModel realm)
UserStorageProviderModel model
Definition: KerberosFederationProvider.java:62
String getName()
Definition: ComponentModel.java:63

◆ getDisableableCredentialTypes()

Set<String> org.keycloak.federation.kerberos.KerberosFederationProvider.getDisableableCredentialTypes ( RealmModel  realm,
UserModel  user 
)
inline

org.keycloak.credential.CredentialInputUpdaterを実装しています。

148  {
149  return Collections.EMPTY_SET;
150  }

◆ getUserByEmail()

UserModel org.keycloak.federation.kerberos.KerberosFederationProvider.getUserByEmail ( String  email,
RealmModel  realm 
)
inline

org.keycloak.storage.user.UserLookupProviderを実装しています。

102  {
103  return null;
104  }

◆ getUserById()

UserModel org.keycloak.federation.kerberos.KerberosFederationProvider.getUserById ( String  id,
RealmModel  realm 
)
inline

org.keycloak.storage.user.UserLookupProviderを実装しています。

107  {
108  return null;
109  }

◆ getUserByUsername()

UserModel org.keycloak.federation.kerberos.KerberosFederationProvider.getUserByUsername ( String  username,
RealmModel  realm 
)
inline

org.keycloak.storage.user.UserLookupProviderを実装しています。

87  {
88  KerberosUsernamePasswordAuthenticator authenticator = factory.createKerberosUsernamePasswordAuthenticator(kerberosConfig);
89  if (authenticator.isUserAvailable(username)) {
90  // Case when method was called with username including kerberos realm like john@REALM.ORG . Authenticator already checked that kerberos realm was correct
91  if (username.contains("@")) {
92  username = username.split("@")[0];
93  }
94 
95  return findOrCreateAuthenticatedUser(realm, username);
96  } else {
97  return null;
98  }
99  }
KerberosFederationProviderFactory factory
Definition: KerberosFederationProvider.java:64
UserModel findOrCreateAuthenticatedUser(RealmModel realm, String username)
Definition: KerberosFederationProvider.java:232
KerberosUsernamePasswordAuthenticator createKerberosUsernamePasswordAuthenticator(CommonKerberosConfig kerberosConfig)
Definition: KerberosFederationProviderFactory.java:143
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63

◆ importUserToKeycloak()

UserModel org.keycloak.federation.kerberos.KerberosFederationProvider.importUserToKeycloak ( RealmModel  realm,
String  username 
)
inlineprotected
258  {
259  // Just guessing email from kerberos realm
260  String email = username + "@" + kerberosConfig.getKerberosRealm().toLowerCase();
261 
262  logger.debugf("Creating kerberos user: %s, email: %s to local Keycloak storage", username, email);
263  UserModel user = session.userLocalStorage().addUser(realm, username);
264  user.setEnabled(true);
265  user.setEmail(email);
266  user.setFederationLink(model.getId());
267  user.setSingleAttribute(KERBEROS_PRINCIPAL, username + "@" + kerberosConfig.getKerberosRealm());
268 
270  user.addRequiredAction(UserModel.RequiredAction.UPDATE_PROFILE);
271  }
272 
273  return validate(realm, user);
274  }
static final String KERBEROS_PRINCIPAL
Definition: KerberosFederationProvider.java:59
UserModel validate(RealmModel realm, UserModel user)
Definition: KerberosFederationProvider.java:74
String getId()
Definition: ComponentModel.java:55
static final Logger logger
Definition: KerberosFederationProvider.java:58
boolean isUpdateProfileFirstLogin()
Definition: KerberosConfig.java:54
String getKerberosRealm()
Definition: CommonKerberosConfig.java:53
KeycloakSession session
Definition: KerberosFederationProvider.java:61
void setEnabled(boolean enabled)
UserModel addUser(RealmModel realm, String id, String username, boolean addDefaultRoles, boolean addDefaultRequiredActions)
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63
UserStorageProviderModel model
Definition: KerberosFederationProvider.java:62

◆ isConfiguredFor()

boolean org.keycloak.federation.kerberos.KerberosFederationProvider.isConfiguredFor ( RealmModel  realm,
UserModel  user,
String  credentialType 
)
inline

org.keycloak.credential.CredentialInputValidatorを実装しています。

163  {
164  return supportsCredentialType(credentialType);
165  }
boolean supportsCredentialType(String credentialType)
Definition: KerberosFederationProvider.java:153

◆ isValid() [1/2]

boolean org.keycloak.federation.kerberos.KerberosFederationProvider.isValid ( RealmModel  realm,
UserModel  local 
)
inline
126  {
127  // KerberosUsernamePasswordAuthenticator.isUserAvailable is an overhead, so avoid it for now
128 
129  String kerberosPrincipal = local.getUsername() + "@" + kerberosConfig.getKerberosRealm();
130  return kerberosPrincipal.equalsIgnoreCase(local.getFirstAttribute(KERBEROS_PRINCIPAL));
131  }
static final String KERBEROS_PRINCIPAL
Definition: KerberosFederationProvider.java:59
String getKerberosRealm()
Definition: CommonKerberosConfig.java:53
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63

◆ isValid() [2/2]

boolean org.keycloak.federation.kerberos.KerberosFederationProvider.isValid ( RealmModel  realm,
UserModel  user,
CredentialInput  input 
)
inline

org.keycloak.credential.CredentialInputValidatorを実装しています。

168  {
169  if (!(input instanceof UserCredentialModel)) return false;
170  if (input.getType().equals(UserCredentialModel.PASSWORD) && !session.userCredentialManager().isConfiguredLocally(realm, user, UserCredentialModel.PASSWORD)) {
171  return validPassword(user.getUsername(), ((UserCredentialModel)input).getValue());
172  } else {
173  return false; // invalid cred type
174  }
175  }
boolean validPassword(String username, String password)
Definition: KerberosFederationProvider.java:177
boolean isConfiguredLocally(RealmModel realm, UserModel user, String type)
UserCredentialManager userCredentialManager()
KeycloakSession session
Definition: KerberosFederationProvider.java:61

◆ preRemove() [1/3]

void org.keycloak.federation.kerberos.KerberosFederationProvider.preRemove ( RealmModel  realm)
inline

org.keycloak.storage.UserStorageProviderを実装しています。

112  {
113 
114  }

◆ preRemove() [2/3]

void org.keycloak.federation.kerberos.KerberosFederationProvider.preRemove ( RealmModel  realm,
RoleModel  role 
)
inline

org.keycloak.storage.UserStorageProviderを実装しています。

117  {
118 
119  }

◆ preRemove() [3/3]

void org.keycloak.federation.kerberos.KerberosFederationProvider.preRemove ( RealmModel  realm,
GroupModel  group 
)
inline

org.keycloak.storage.UserStorageProviderを実装しています。

122  {
123 
124  }

◆ supportsCredentialAuthenticationFor()

boolean org.keycloak.federation.kerberos.KerberosFederationProvider.supportsCredentialAuthenticationFor ( String  type)
inline

org.keycloak.credential.CredentialAuthenticationを実装しています。

158  {
159  return CredentialModel.KERBEROS.equals(type);
160  }

◆ supportsCredentialType()

boolean org.keycloak.federation.kerberos.KerberosFederationProvider.supportsCredentialType ( String  credentialType)
inline

org.keycloak.credential.CredentialInputUpdaterを実装しています。

153  {
154  return credentialType.equals(CredentialModel.KERBEROS) || (kerberosConfig.isAllowPasswordAuthentication() && credentialType.equals(CredentialModel.PASSWORD));
155  }
boolean isAllowPasswordAuthentication()
Definition: KerberosConfig.java:50
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63

◆ updateCredential()

boolean org.keycloak.federation.kerberos.KerberosFederationProvider.updateCredential ( RealmModel  realm,
UserModel  user,
CredentialInput  input 
)
inline

org.keycloak.credential.CredentialInputUpdaterを実装しています。

134  {
135  if (!(input instanceof UserCredentialModel) || !CredentialModel.PASSWORD.equals(input.getType())) return false;
136  if (kerberosConfig.getEditMode() == EditMode.READ_ONLY) {
137  throw new ReadOnlyException("Can't change password in Keycloak database. Change password with your Kerberos server");
138  }
139  return false;
140  }
READ_ONLY
Definition: UserStorageProvider.java:75
EditMode getEditMode()
Definition: KerberosConfig.java:41
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63

◆ validate()

UserModel org.keycloak.federation.kerberos.KerberosFederationProvider.validate ( RealmModel  realm,
UserModel  user 
)
inline

org.keycloak.storage.user.ImportedUserValidationを実装しています。

74  {
75  if (!isValid(realm, user)) {
76  return null;
77  }
78 
79  if (kerberosConfig.getEditMode() == EditMode.READ_ONLY) {
80  return new ReadOnlyKerberosUserModelDelegate(user, this);
81  } else {
82  return user;
83  }
84  }
READ_ONLY
Definition: UserStorageProvider.java:75
EditMode getEditMode()
Definition: KerberosConfig.java:41
boolean isValid(RealmModel realm, UserModel local)
Definition: KerberosFederationProvider.java:126
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63

◆ validPassword()

boolean org.keycloak.federation.kerberos.KerberosFederationProvider.validPassword ( String  username,
String  password 
)
inlineprotected
177  {
179  KerberosUsernamePasswordAuthenticator authenticator = factory.createKerberosUsernamePasswordAuthenticator(kerberosConfig);
180  return authenticator.validUser(username, password);
181  } else {
182  return false;
183  }
184  }
boolean isAllowPasswordAuthentication()
Definition: KerberosConfig.java:50
KerberosFederationProviderFactory factory
Definition: KerberosFederationProvider.java:64
boolean validUser(String username, String password)
Definition: KerberosUsernamePasswordAuthenticator.java:88
KerberosUsernamePasswordAuthenticator createKerberosUsernamePasswordAuthenticator(CommonKerberosConfig kerberosConfig)
Definition: KerberosFederationProviderFactory.java:143
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63

メンバ詳解

◆ factory

KerberosFederationProviderFactory org.keycloak.federation.kerberos.KerberosFederationProvider.factory
protected

◆ KERBEROS_PRINCIPAL

final String org.keycloak.federation.kerberos.KerberosFederationProvider.KERBEROS_PRINCIPAL = "KERBEROS_PRINCIPAL"
static

◆ kerberosConfig

KerberosConfig org.keycloak.federation.kerberos.KerberosFederationProvider.kerberosConfig
protected

◆ logger

final Logger org.keycloak.federation.kerberos.KerberosFederationProvider.logger = Logger.getLogger(KerberosFederationProvider.class)
staticprivate

◆ model

UserStorageProviderModel org.keycloak.federation.kerberos.KerberosFederationProvider.model
protected

◆ session

KeycloakSession org.keycloak.federation.kerberos.KerberosFederationProvider.session
protected

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