web-dev-qa-db-fra.com

Comment puis-je restreindre l'accès client à un seul groupe d'utilisateurs dans keycloak?

J'ai un client dans keycloak pour ma page web awx (ansible tower). Je n'ai besoin que des utilisateurs d'un groupe keycloak spécifique pour pouvoir me connecter via ce client.

Comment puis-je interdire à tous les autres utilisateurs (à l'exception d'un groupe particulier) d'utiliser ce client keycloak?

9
lukasell

Je l'ai résolu comme ceci:

  1. Créez un nouveau rôle dans Keycloak.
  2. Attribuez ce rôle au groupe.
  3. Créez un nouveau script d'authentification dans Kycloak. Configurez quel rôle est autorisé lors de la connexion (par exemple user.hasRole(realm.getRole("yourRoleName"))).
  4. Dans les paramètres du client, sous "Remplacements du flux d'authentification", choisissez le script d'authentification qui vient d'être créé.
4
lukasell

Sur la console d'administration Keycloak, accédez au menu Clients, sélectionnez votre client. Sur la page de configuration du client, définissez Autorisation activée: sur , cliquez sur Enregistrer . Un nouvel onglet Autorisation devrait apparaître, allez-y, puis dans Politiques en dessous, cliquez sur Créer une stratégie et sélectionnez Stratégie basée sur les groupes . Là, vous pouvez restreindre l'accès à des groupes spécifiques , en supposant que vous avez déjà défini vos groupes via le menu Groupes.

--ÉDITION 2019-11-08--

Comme mentionné dans les commentaires, Le protocole client doit être défini sur openid-connect et Le type d'accès doit être défini sur confidentiel , afin de rendre le Autorisation activée option visible.

7
Cyril Dangerville

Si cela peut aider, voici un script qui aide à implémenter ce comportement pour n'importe quel client: si le client contient un rôle donné (ici il s'appelle feature:authenticate), le script vérifie si l'utilisateur a le rôle et affiche une page d'erreur (un nouveau modèle qui doit être déployé dans le thème) sinon.

AuthenticationFlowError = Java.type("org.keycloak.authentication.AuthenticationFlowError");

 function authenticate(context) {
    var MANDATORY_ROLE = 'feature:authenticate';
    var username = user ? user.username : "anonymous";

    var client = session.getContext().getClient();

    LOG.debug("Checking access to authentication for client '" + client.getName() + "' through mandatory role '" + MANDATORY_ROLE + "' for user '" + username + "'");

    var mandatoryRole = client.getRole(MANDATORY_ROLE);

    if (mandatoryRole === null) {
        LOG.debug("No mandatory role '" + MANDATORY_ROLE + "' for client '" + client.getName() + "'");
        return context.success();
    }

    if (user.hasRole(mandatoryRole)) {
        LOG.info("Successful authentication for user '" + username + "' with mandatory role '" + MANDATORY_ROLE + "' for client '" + client.getName() + "'");
        return context.success();
    }

    LOG.info("Denied authentication for user '" + username + "' without mandatory role '" + MANDATORY_ROLE + "' for client '" + client.getName() + "'");
    return denyAccess(context, mandatoryRole);
 }

 function denyAccess(context, mandatoryRole) {
    var formBuilder = context.form();
    var client = session.getContext().getClient();
    var description = !mandatoryRole.getAttribute('deniedMessage').isEmpty() ? mandatoryRole.getAttribute('deniedMessage') : [''];
    var form = formBuilder
        .setAttribute('clientUrl', client.getRootUrl())
        .setAttribute('clientName', client.getName())
        .setAttribute('description', description[0])
        .createForm('denied-auth.ftl');
    return context.failure(AuthenticationFlowError.INVALID_USER, form);
 }
3
Allan

selon docu https://www.keycloak.org/docs/6.0/server_admin/#executions vous devez activer cette fonctionnalité pour ajouter des scripts personnalisés avec "add execution".

bin/standalone.sh|bat -Dkeycloak.profile.feature.scripts=enabled

Solution @Allan avec fonctionnalité: authentifier me semble bien

1
Andre Krueger

Vous pouvez utiliser cette extension pour restreindre l'accès à un groupe spécifique: https://github.com/thomasdarimont/keycloak-extension-playground/tree/master/auth-require-group-extension

0
dmorlock