Keycloak authenticatoin flow - Identity Provider Redirector 之后的脚本
Keycloak authenticatoin flow - script after Identity Provider Redirector
对于我的项目,我的 Keycloak 中有用户,他们的身份提供商 Link 用户 ID 已正确设置。
其中一些用户没有为我的项目客户设置角色。
这些用户登录(因为他们有一个有效的 Google 帐户)到我的应用程序,然后应用程序必须管理他们不应该访问应用程序的事实(因为他们没有角色)。
如果用户没有角色,我想要告诉 keycloak 不要重定向到我的应用程序。
我已经为用户名密码表单完成了此操作(使用脚本,请参阅下面的脚本代码)但是我无法使用身份提供者重定向器成功执行此操作,它之后的脚本似乎没有被执行(重定向似乎发生 在 身份提供程序重定向器中)。
在此先感谢您的帮助,
编辑:适用于用户名密码表单的脚本:
/*
* Template for JavaScript based authenticators.
* See org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticatorFactory
*/
// import enum for error lookup
AuthenticationFlowError = Java.type("org.keycloak.authentication.AuthenticationFlowError");
UserCredentialModel = Java.type("org.keycloak.models.UserCredentialModel");
Errors = Java.type("org.keycloak.events.Errors");
OAuth2ErrorRepresentation = Java.type("org.keycloak.representations.idm.OAuth2ErrorRepresentation");
MediaType = Java.type("javax.ws.rs.core.MediaType");
Response = Java.type("javax.ws.rs.core.Response");
FormMessage = Java.type('org.keycloak.models.utils.FormMessage');
/**
* An example authenticate function.
*
* The following variables are available for convenience:
* user - current user {@see org.keycloak.models.UserModel}
* realm - current realm {@see org.keycloak.models.RealmModel}
* session - current KeycloakSession {@see org.keycloak.models.KeycloakSession}
* httpRequest - current HttpRequest {@see org.jboss.resteasy.spi.HttpRequest}
* script - current script {@see org.keycloak.models.ScriptModel}
* authenticationSession - current authentication session {@see org.keycloak.sessions.AuthenticationSessionModel}
* LOG - current logger {@see org.jboss.logging.Logger}
*
* You one can extract current http request headers via:
* httpRequest.getHttpHeaders().getHeaderString("Forwarded")
*
* @param context {@see org.keycloak.authentication.AuthenticationFlowContext}
*/
function authenticate(context) {
var username = user ? user.username : "anonymous";
LOG.info(script.name + " trace auth for: " + username + " " + session.getContext().getClient().getClientId());
var client = session.getContext().getClient();
var rolesClient = user.getClientRoleMappings(client);
if (rolesClient.isEmpty()) {
context.forkWithErrorMessage(new FormMessage('label', 'Utilisateur non autorisé'));
return;
}
context.success();
}
我在我的项目中遇到了同样的问题。我设法在身份提供者上使用 "Post Login Flow" 解决了这个问题。
我必须做的步骤是:
- 使用一个执行脚本创建一个新流程(您可以在此处粘贴您的脚本)。
- 转到身份提供者。下字段"Post Login Flow"select流从1.
希望这也能解决您的问题
对于我的项目,我的 Keycloak 中有用户,他们的身份提供商 Link 用户 ID 已正确设置。 其中一些用户没有为我的项目客户设置角色。 这些用户登录(因为他们有一个有效的 Google 帐户)到我的应用程序,然后应用程序必须管理他们不应该访问应用程序的事实(因为他们没有角色)。 如果用户没有角色,我想要告诉 keycloak 不要重定向到我的应用程序。 我已经为用户名密码表单完成了此操作(使用脚本,请参阅下面的脚本代码)但是我无法使用身份提供者重定向器成功执行此操作,它之后的脚本似乎没有被执行(重定向似乎发生 在 身份提供程序重定向器中)。
在此先感谢您的帮助,
编辑:适用于用户名密码表单的脚本:
/*
* Template for JavaScript based authenticators.
* See org.keycloak.authentication.authenticators.browser.ScriptBasedAuthenticatorFactory
*/
// import enum for error lookup
AuthenticationFlowError = Java.type("org.keycloak.authentication.AuthenticationFlowError");
UserCredentialModel = Java.type("org.keycloak.models.UserCredentialModel");
Errors = Java.type("org.keycloak.events.Errors");
OAuth2ErrorRepresentation = Java.type("org.keycloak.representations.idm.OAuth2ErrorRepresentation");
MediaType = Java.type("javax.ws.rs.core.MediaType");
Response = Java.type("javax.ws.rs.core.Response");
FormMessage = Java.type('org.keycloak.models.utils.FormMessage');
/**
* An example authenticate function.
*
* The following variables are available for convenience:
* user - current user {@see org.keycloak.models.UserModel}
* realm - current realm {@see org.keycloak.models.RealmModel}
* session - current KeycloakSession {@see org.keycloak.models.KeycloakSession}
* httpRequest - current HttpRequest {@see org.jboss.resteasy.spi.HttpRequest}
* script - current script {@see org.keycloak.models.ScriptModel}
* authenticationSession - current authentication session {@see org.keycloak.sessions.AuthenticationSessionModel}
* LOG - current logger {@see org.jboss.logging.Logger}
*
* You one can extract current http request headers via:
* httpRequest.getHttpHeaders().getHeaderString("Forwarded")
*
* @param context {@see org.keycloak.authentication.AuthenticationFlowContext}
*/
function authenticate(context) {
var username = user ? user.username : "anonymous";
LOG.info(script.name + " trace auth for: " + username + " " + session.getContext().getClient().getClientId());
var client = session.getContext().getClient();
var rolesClient = user.getClientRoleMappings(client);
if (rolesClient.isEmpty()) {
context.forkWithErrorMessage(new FormMessage('label', 'Utilisateur non autorisé'));
return;
}
context.success();
}
我在我的项目中遇到了同样的问题。我设法在身份提供者上使用 "Post Login Flow" 解决了这个问题。
我必须做的步骤是:
- 使用一个执行脚本创建一个新流程(您可以在此处粘贴您的脚本)。
- 转到身份提供者。下字段"Post Login Flow"select流从1.
希望这也能解决您的问题