密钥泄漏身份验证流程-身份提供程序重定向器之后的脚本

时间:2018-10-24 09:18:15

标签: keycloak

对于我的项目,我的用户在我的密钥库中存在正确设置了其身份提供者链接用户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();
}

1 个答案:

答案 0 :(得分:0)

我的项目也遇到了同样的问题。我设法通过身份提供者上的“登录后流程”解决了该问题。

我要做的步骤是:

  1. 使用一个执行脚本创建新的流程(您可以在此处粘贴脚本)。
  2. 转到身份提供者。在“登录后流程”字段下,从1中选择流程。

我希望这也能解决您的问题