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

公開メンバ関数

void authenticate (AuthenticationFlowContext context)
 
void action (AuthenticationFlowContext context)
 
boolean requiresUser ()
 
boolean configuredFor (KeycloakSession session, RealmModel realm, UserModel user)
 
void setRequiredActions (KeycloakSession session, RealmModel realm, UserModel user)
 
void close ()
 

静的変数

static final String SCRIPT_CODE = "scriptCode"
 
static final String SCRIPT_NAME = "scriptName"
 
static final String SCRIPT_DESCRIPTION = "scriptDescription"
 
static final String ACTION_FUNCTION_NAME = "action"
 
static final String AUTHENTICATE_FUNCTION_NAME = "authenticate"
 

非公開メンバ関数

void tryInvoke (String functionName, AuthenticationFlowContext context)
 
boolean hasAuthenticatorConfig (AuthenticationFlowContext context)
 
InvocableScriptAdapter getInvocableScriptAdapter (AuthenticationFlowContext context)
 

静的非公開変数類

static final Logger LOGGER = Logger.getLogger(ScriptBasedAuthenticator.class)
 

詳解

An Authenticator that can execute a configured script during authentication flow.

Scripts must at least provide one of the following functions:

  1. which is called from Authenticator#authenticate(AuthenticationFlowContext)
  2. action(..)
    which is called from Authenticator#action(AuthenticationFlowContext)

Custom Authenticator's should at least provide the

function. The following script javax.script.Bindings are available for convenient use within script code.

  1. script
    the ScriptModel to access script metadata
  2. realm
    the RealmModel
  3. user
    the current UserModel
  4. session
    the active KeycloakSession
  5. authenticationSession
    the current org.keycloak.sessions.AuthenticationSessionModel
  6. httpRequest
    the current org.jboss.resteasy.spi.HttpRequest
  7. LOG
    a org.jboss.logging.Logger scoped to ScriptBasedAuthenticator/li>

Note that the

user

variable is only defined when the user was identified by a preceeding authentication step, e.g. by the UsernamePasswordForm authenticator.

Additional context information can be extracted from the

context

argument passed to the

authenticate(context)

or

action(context)

function.

An example ScriptBasedAuthenticator definition could look as follows:

AuthenticationFlowError = Java.type("org.keycloak.authentication.AuthenticationFlowError");
function authenticate(context) {
var username = user ? user.username : "anonymous";
LOG.info(script.name + " --> trace auth for: " + username);
if ( username === "tester"
&& user.getAttribute("someAttribute")
&& user.getAttribute("someAttribute").contains("someValue")) {
context.failure(AuthenticationFlowError.INVALID_USER);
return;
}
context.success();
}
著者
Thomas Darimont

関数詳解

◆ action()

void org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticator.action ( AuthenticationFlowContext  context)
inline
106  {
108  }
static final String ACTION_FUNCTION_NAME
Definition: ScriptBasedAuthenticator.java:97
void tryInvoke(String functionName, AuthenticationFlowContext context)
Definition: ScriptBasedAuthenticator.java:110

◆ authenticate()

void org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticator.authenticate ( AuthenticationFlowContext  context)
inline
101  {
103  }
void tryInvoke(String functionName, AuthenticationFlowContext context)
Definition: ScriptBasedAuthenticator.java:110
static final String AUTHENTICATE_FUNCTION_NAME
Definition: ScriptBasedAuthenticator.java:98

◆ close()

void org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticator.close ( )
inline
185  {
186  //NOOP
187  }

◆ configuredFor()

boolean org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticator.configuredFor ( KeycloakSession  session,
RealmModel  realm,
UserModel  user 
)
inline
174  {
175  return true;
176  }

◆ getInvocableScriptAdapter()

InvocableScriptAdapter org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticator.getInvocableScriptAdapter ( AuthenticationFlowContext  context)
inlineprivate
141  {
142 
143  Map<String, String> config = context.getAuthenticatorConfig().getConfig();
144 
145  String scriptName = config.get(SCRIPT_NAME);
146  String scriptCode = config.get(SCRIPT_CODE);
147  String scriptDescription = config.get(SCRIPT_DESCRIPTION);
148 
149  RealmModel realm = context.getRealm();
150 
151  ScriptingProvider scripting = context.getSession().getProvider(ScriptingProvider.class);
152 
153  //TODO lookup script by scriptId instead of creating it every time
154  ScriptModel script = scripting.createScript(realm.getId(), ScriptModel.TEXT_JAVASCRIPT, scriptName, scriptCode, scriptDescription);
155 
156  //how to deal with long running scripts -> timeout?
157  return scripting.prepareInvocableScript(script, bindings -> {
158  bindings.put("script", script);
159  bindings.put("realm", context.getRealm());
160  bindings.put("user", context.getUser());
161  bindings.put("session", context.getSession());
162  bindings.put("httpRequest", context.getHttpRequest());
163  bindings.put("authenticationSession", context.getAuthenticationSession());
164  bindings.put("LOG", LOGGER);
165  });
166  }
static final String SCRIPT_NAME
Definition: ScriptBasedAuthenticator.java:94
static final String SCRIPT_CODE
Definition: ScriptBasedAuthenticator.java:93
static final String SCRIPT_DESCRIPTION
Definition: ScriptBasedAuthenticator.java:95
static final Logger LOGGER
Definition: ScriptBasedAuthenticator.java:91

◆ hasAuthenticatorConfig()

boolean org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticator.hasAuthenticatorConfig ( AuthenticationFlowContext  context)
inlineprivate
134  {
135  return context != null
136  && context.getAuthenticatorConfig() != null
137  && context.getAuthenticatorConfig().getConfig() != null
138  && !context.getAuthenticatorConfig().getConfig().isEmpty();
139  }

◆ requiresUser()

boolean org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticator.requiresUser ( )
inline
169  {
170  return false;
171  }

◆ setRequiredActions()

void org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticator.setRequiredActions ( KeycloakSession  session,
RealmModel  realm,
UserModel  user 
)
inline
179  {
180  //TODO make RequiredActions configurable in the script
181  //NOOP
182  }

◆ tryInvoke()

void org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticator.tryInvoke ( String  functionName,
AuthenticationFlowContext  context 
)
inlineprivate
110  {
111 
112  if (!hasAuthenticatorConfig(context)) {
113  // this is an empty not yet configured script authenticator
114  // we mark this execution as success to not lock out users due to incompletely configured authenticators.
115  context.success();
116  return;
117  }
118 
119  InvocableScriptAdapter invocableScriptAdapter = getInvocableScriptAdapter(context);
120 
121  if (!invocableScriptAdapter.isDefined(functionName)) {
122  return;
123  }
124 
125  try {
126  //should context be wrapped in a read-only wrapper?
127  invocableScriptAdapter.invokeFunction(functionName, context);
128  } catch (ScriptExecutionException e) {
129  LOGGER.error(e);
130  context.failure(AuthenticationFlowError.INTERNAL_ERROR);
131  }
132  }
boolean hasAuthenticatorConfig(AuthenticationFlowContext context)
Definition: ScriptBasedAuthenticator.java:134
InvocableScriptAdapter getInvocableScriptAdapter(AuthenticationFlowContext context)
Definition: ScriptBasedAuthenticator.java:141
static final Logger LOGGER
Definition: ScriptBasedAuthenticator.java:91

メンバ詳解

◆ ACTION_FUNCTION_NAME

final String org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticator.ACTION_FUNCTION_NAME = "action"
staticpackage

◆ AUTHENTICATE_FUNCTION_NAME

final String org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticator.AUTHENTICATE_FUNCTION_NAME = "authenticate"
staticpackage

◆ LOGGER

final Logger org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticator.LOGGER = Logger.getLogger(ScriptBasedAuthenticator.class)
staticprivate

◆ SCRIPT_CODE

final String org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticator.SCRIPT_CODE = "scriptCode"
staticpackage

◆ SCRIPT_DESCRIPTION

final String org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticator.SCRIPT_DESCRIPTION = "scriptDescription"
staticpackage

◆ SCRIPT_NAME

final String org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticator.SCRIPT_NAME = "scriptName"
staticpackage

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