keycloak-federation
公開メンバ関数 | 静的公開変数類 | 限定公開メンバ関数 | 限定公開変数類 | 静的非公開変数類 | 全メンバ一覧
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  }
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63
KerberosFederationProviderFactory factory
Definition: KerberosFederationProvider.java:64
KeycloakSession session
Definition: KerberosFederationProvider.java:61
UserStorageProviderModel model
Definition: KerberosFederationProvider.java:62

関数詳解

◆ authenticate()

CredentialValidationOutput org.keycloak.federation.kerberos.KerberosFederationProvider.authenticate ( RealmModel  realm,
CredentialInput  input 
)
inline
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  }
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63
KerberosFederationProviderFactory factory
Definition: KerberosFederationProvider.java:64
UserModel findOrCreateAuthenticatedUser(RealmModel realm, String username)
Definition: KerberosFederationProvider.java:232
SPNEGOAuthenticator createSPNEGOAuthenticator(String spnegoToken, CommonKerberosConfig kerberosConfig)
Definition: KerberosFederationProviderFactory.java:134
void authenticate()
Definition: SPNEGOAuthenticator.java:61

◆ close()

void org.keycloak.federation.kerberos.KerberosFederationProvider.close ( )
inline
221  {
222 
223  }

◆ disableCredentialType()

void org.keycloak.federation.kerberos.KerberosFederationProvider.disableCredentialType ( RealmModel  realm,
UserModel  user,
String  credentialType 
)
inline
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 Logger logger
Definition: KerberosFederationProvider.java:58
UserModel validate(RealmModel realm, UserModel user)
Definition: KerberosFederationProvider.java:74
KeycloakSession session
Definition: KerberosFederationProvider.java:61
UserStorageProviderModel model
Definition: KerberosFederationProvider.java:62
UserModel importUserToKeycloak(RealmModel realm, String username)
Definition: KerberosFederationProvider.java:258
static final String KERBEROS_PRINCIPAL
Definition: KerberosFederationProvider.java:59

◆ getDisableableCredentialTypes()

Set<String> org.keycloak.federation.kerberos.KerberosFederationProvider.getDisableableCredentialTypes ( RealmModel  realm,
UserModel  user 
)
inline
148  {
149  return Collections.EMPTY_SET;
150  }

◆ getUserByEmail()

UserModel org.keycloak.federation.kerberos.KerberosFederationProvider.getUserByEmail ( String  email,
RealmModel  realm 
)
inline
102  {
103  return null;
104  }

◆ getUserById()

UserModel org.keycloak.federation.kerberos.KerberosFederationProvider.getUserById ( String  id,
RealmModel  realm 
)
inline
107  {
108  return null;
109  }

◆ getUserByUsername()

UserModel org.keycloak.federation.kerberos.KerberosFederationProvider.getUserByUsername ( String  username,
RealmModel  realm 
)
inline
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  }
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63
KerberosFederationProviderFactory factory
Definition: KerberosFederationProvider.java:64
UserModel findOrCreateAuthenticatedUser(RealmModel realm, String username)
Definition: KerberosFederationProvider.java:232
KerberosUsernamePasswordAuthenticator createKerberosUsernamePasswordAuthenticator(CommonKerberosConfig kerberosConfig)
Definition: KerberosFederationProviderFactory.java:143

◆ 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 Logger logger
Definition: KerberosFederationProvider.java:58
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63
String getKerberosRealm()
Definition: CommonKerberosConfig.java:53
UserModel validate(RealmModel realm, UserModel user)
Definition: KerberosFederationProvider.java:74
boolean isUpdateProfileFirstLogin()
Definition: KerberosConfig.java:54
KeycloakSession session
Definition: KerberosFederationProvider.java:61
UserStorageProviderModel model
Definition: KerberosFederationProvider.java:62
static final String KERBEROS_PRINCIPAL
Definition: KerberosFederationProvider.java:59

◆ isConfiguredFor()

boolean org.keycloak.federation.kerberos.KerberosFederationProvider.isConfiguredFor ( RealmModel  realm,
UserModel  user,
String  credentialType 
)
inline
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  }
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63
String getKerberosRealm()
Definition: CommonKerberosConfig.java:53
static final String KERBEROS_PRINCIPAL
Definition: KerberosFederationProvider.java:59

◆ isValid() [2/2]

boolean org.keycloak.federation.kerberos.KerberosFederationProvider.isValid ( RealmModel  realm,
UserModel  user,
CredentialInput  input 
)
inline
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
KeycloakSession session
Definition: KerberosFederationProvider.java:61

◆ preRemove() [1/3]

void org.keycloak.federation.kerberos.KerberosFederationProvider.preRemove ( RealmModel  realm)
inline
112  {
113 
114  }

◆ preRemove() [2/3]

void org.keycloak.federation.kerberos.KerberosFederationProvider.preRemove ( RealmModel  realm,
RoleModel  role 
)
inline
117  {
118 
119  }

◆ preRemove() [3/3]

void org.keycloak.federation.kerberos.KerberosFederationProvider.preRemove ( RealmModel  realm,
GroupModel  group 
)
inline
122  {
123 
124  }

◆ supportsCredentialAuthenticationFor()

boolean org.keycloak.federation.kerberos.KerberosFederationProvider.supportsCredentialAuthenticationFor ( String  type)
inline
158  {
159  return CredentialModel.KERBEROS.equals(type);
160  }

◆ supportsCredentialType()

boolean org.keycloak.federation.kerberos.KerberosFederationProvider.supportsCredentialType ( String  credentialType)
inline
153  {
154  return credentialType.equals(CredentialModel.KERBEROS) || (kerberosConfig.isAllowPasswordAuthentication() && credentialType.equals(CredentialModel.PASSWORD));
155  }
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63
boolean isAllowPasswordAuthentication()
Definition: KerberosConfig.java:50

◆ updateCredential()

boolean org.keycloak.federation.kerberos.KerberosFederationProvider.updateCredential ( RealmModel  realm,
UserModel  user,
CredentialInput  input 
)
inline
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  }
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63
EditMode getEditMode()
Definition: KerberosConfig.java:41

◆ validate()

UserModel org.keycloak.federation.kerberos.KerberosFederationProvider.validate ( RealmModel  realm,
UserModel  user 
)
inline
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  }
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63
boolean isValid(RealmModel realm, UserModel local)
Definition: KerberosFederationProvider.java:126
EditMode getEditMode()
Definition: KerberosConfig.java:41

◆ 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  }
KerberosConfig kerberosConfig
Definition: KerberosFederationProvider.java:63
KerberosFederationProviderFactory factory
Definition: KerberosFederationProvider.java:64
boolean validUser(String username, String password)
Definition: KerberosUsernamePasswordAuthenticator.java:88
KerberosUsernamePasswordAuthenticator createKerberosUsernamePasswordAuthenticator(CommonKerberosConfig kerberosConfig)
Definition: KerberosFederationProviderFactory.java:143
boolean isAllowPasswordAuthentication()
Definition: KerberosConfig.java:50

メンバ詳解

◆ 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

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