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
?
Je l'ai résolu comme ceci:
user.hasRole(realm.getRole("yourRoleName"))
).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.
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);
}
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
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