Synchroniser les groupes entre Keycloak et Discourse

Bonjour :slight_smile:

Je suis entrain de mettre en place forum Discourse pour mon association, et il est relié à notre Keycloak qui gère le SSO. La connexion se passe sans soucis, et les comptes sont bien crées. Mais, les groupes dont font parti les utilisateurices dans le Keycloak ne sont pas synchronisés dans le Discourse.

Nous utilisons le plugin discourse-saml dans notre installation.

Nous avons la configuration suivante ;

  ## Settings for the SAML plugin

  DISCOURSE_SAML_TARGET_URL: "https://sso.example.fr/auth/realms/example/protocol/saml"
  DISCOURSE_SAML_REQUEST_METHOD: "post"
  DISCOURSE_SAML_FULL_SCREEN_LOGIN: "True"
  DISCOURSE_SAML_CERT: "-----BEGIN CERTIFICATE-----YPQ1z6JrA==----END CERTIFICATE-----"

  DISCOURSE_SAML_BUTTON_TITLE: "Se connecter avec le SSO "
  DISCOURSE_SAML_TITLE: "Connexion via le SSO "
  # We are using the unspecified format to prevent the IDP from sending us a UUID instead of the username.
  DISCOURSE_SAML_NAME_IDENTIFIER_FORMAT: "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"
  DISCOURSE_SAML_AUTO_CREATE_ACCOUNT: true
  
  ### Settings for groups in the SAML plugin
  DISCOURSE_SAML_SYNC_GROUPS: "True"
  DISCOURSE_SAML_GROUPS_FULLSYNC: "False"
  DISCOURSE_SAML_GROUPS_ATTRIBUTE: "memberOf"
  DISCOURSE_SAML_SYNC_GROUPS_LIST: "membres"
  DISCOURSE_SAML_SYNC_MODERATOR: true
  DISCOURSE_SAML_MODERATOR_ATTRIBUTE: "isModeratorDiscourse"
  DISCOURSE_SAML_SYNC_ADMIN: true
  DISCOURSE_SAML_ADMIN_ATTRIBUTE: "isAdminDiscourse"
  DISCOURSE_SAML_LOG_AUTH: true
  DISCOURSE_SAML_DEBUG_AUTH: true

Et la configuration de notre groupe membres est le suivant dans Keycloak :

À noter qu’il existe déjà un groupe du nom de Membres-Example dans le discourse, qui as été créer avant la configuration de la connection au SSO dans le forum. Mais si se connecte via le SSO, avec un compte faisant parti du groupe membres dans Keycloak, hé bien nous ne faisons pas parti de ce groupe dans le forum discourse pour autant, alors que c’est le résultat attendu.

En me connectant je ne suis pas non plus inclus dans le groupe de modération, alors qu’il me semble que je devrais.

Je vous remerci pour votre attention et je suis à disposition pour tout complément d’information,

merci, nono

Je ne savais pas que le plugin saml mappait les groupes, intéressant cc @unteem :wink:

Pour OIDC, il manque cette PR.

Je pense que dans ton client saml, il faut ajouter le mapping de la clé « memberOf »/

Au final, grâce à l’aide d’un autre membre de l’association, nous avons réussit.

Il faut plusieurs choses ;

D’une part, la configuration de Discourse tel que posté dans le topic est valable.

Par contre, niveau Keycloak, il faut la configuration suivante :

  • Dans votre Realm, vous allez ajouter un groupe.
    • Dans ses Attributes, vous pouvez ajouter le isModeratorDiscourse ou isAdminDiscourse et mettre la valeur à 1. Les membres du groupe seront alors modérateurices ou administrateurices.
      • Ajoutez un Role Mapping qui correspond au nom du Client Mapping créer pour le client à l’étape suivante.
  • Dans votre Realm, ajoutez un client configuré comme tout autre client SAML.
    • Vous allez ensuite ajouter autant de Rôles que vous souhaitez, le nom du rôle correspondant à un groupe dans Discourse ( il faut qu’il existe déjà dans Discourse, créez-le à la main. )
    • Dans les Clients Scope, allez dans "nom du client"-dedicated.
      • Vous allez ensuite ajouter des Mappers. Il en existe déjà par défaut.
        • Voir le tableau ci dessous pour la liste des Mappers que nous utilisons.
Name Category Type Priority
email AttributeStatement User Property 0
memberOf Role Mapper Role list 0
isAdminDiscourse AttributeStatement Mapper User Attribute 0
username AttributeStatement Mapper User Property 0
isModeratorDiscourse AttributeStatement Mapper User Attribute 0

J’espère que c’est clair,

Bon courage :slight_smile: