super utilisateur

1
0
-1

bonjour,

utilisateur récent du produit Bonita BPM, j'ai besoin de pouvoir piloter mes processus/tâche depuis une interface REST appelé en C#
Après lecture des forums, j'ai réussi à effectuer une connexion et la liste des processus par une requête GET.
Par contre, impossible de pouvoir faire une requête POST pour lancer un processus; j'ai systématiquement une erreur 401.
Le code d'exécution est le suivante:

` public static void testAppel()
{
string serveur = "localhost";
int port = 8080;

    Uri adresseServeur = new Uri("http://" + serveur + ":" + port.ToString());
    using (HttpClientHandler handler = new HttpClientHandler { UseCookies = false })
    {
        using (HttpClient client = new HttpClient(handler) { BaseAddress = adresseServeur })
        {
            //  etape 1: connexion

            Dictionary<string, string> contenuForm = new Dictionary<string, string>
                {
                    { "username", "MAIDIS" },
                    { "password", "maidis" },
                    { "redirect", "false" }
                };

            HttpResponseMessage resultat = client.PostAsync("/bonita/loginservice", new FormUrlEncodedContent(contenuForm)).Result;

            string setCookie = string.Empty;

            foreach (var header in resultat.Headers.Where(header => header.Key == "Set-Cookie"))
            {
                foreach (string value in header.Value)
                {
                    if (setCookie != string.Empty)
                        setCookie += ", ";

                    setCookie = setCookie + value;
                }
                break;
            }

            //  etape2: liste des processus

            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            string url = "/bonita/API/bpm/process";

            StringBuilder chaineParametres = new StringBuilder("?p=0&c=10&f=");
            chaineParametres.Append(HttpUtility.UrlEncode("activationState=ENABLED"));

            HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Get, url + chaineParametres.ToString());

            message.Headers.Add("Cookie", setCookie);

            HttpResponseMessage result;

            result = client.SendAsync(message).Result;

            //  envoi d'une exception en cas d'erreur d'accès
            result.EnsureSuccessStatusCode();

            string contenu = result.Content.ReadAsStringAsync().Result;

            //Execute<List<Processus>>("/bonita/API/bpm/process", parametres, HttpMethod.Get);
            List<Processus> processusApplication = JsonConvert.DeserializeObject<List<Processus>>(contenu);

            //  etape 3: récupération de l'identifiant du processus

            Processus processusConnexion = null;

            foreach (Processus processusRecherche in processusApplication)
                if (processusRecherche.name == "Accueil Patient")
                {
                    processusConnexion = processusRecherche;
                    break;
                }

            //  etape 4: création d'un cas selon un processus
            if (processusConnexion != null)
            {
                ProcessusId parametre = new ProcessusId(processusConnexion.id.ToString());

                string contenuRequete = JsonConvert.SerializeObject(parametre);
                message = new HttpRequestMessage(HttpMethod.Post, "/bonita/API/bpm/case");

                message.Content = new StringContent(contenuRequete, Encoding.UTF8);
                message.Content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/json");

                message.Headers.Add("Cookie", setCookie);

                result = client.PostAsync("/bonita/API/bpm/case", message.Content).Result;

                //  envoi d'une exception en cas d'erreur d'accès
                result.EnsureSuccessStatusCode();

                contenu = result.Content.ReadAsStringAsync().Result;

                Cas entiteRetournee = JsonConvert.DeserializeObject<Cas>(contenu);
            }
        }

    }
}

`
je passe bien dans le cookie le jeton Bonita (X-Bonita-API-Token). J'utilise JSon.NET pour récupérer et envoyer le contenu JSON dans des classes (Processus, ProcessusId et Cas), et cela marchait
très bien.
Par contre, j'ai essayé de modifier les droits pour voir si le problème ne venait pas de là, et j'ai toujours une erreur 401 pour l'exécution d'un processus.

Mon organisation est la suivante:

<?xml version="1.0" encoding="UTF-8"?>
<organization:Organization xmlns:organization="http://documentation.bonitasoft.com/organization-xml-schema/1.1">
<customUserInfoDefinitions/>
<users>
<user userName="Docteur Knock">
<firstName>philippe</firstName>
<lastName>Knock</lastName>
<title>Docteur</title>
<jobTitle>médecin généraliste</jobTitle>
<manager></manager>
<personalData>
<email>knock@sib.fr</email>
<website>www.sib.fr</website>
</personalData>
<professionalData/>
<password encrypted="false">maidis</password>
<customUserInfoValues/>
</user>
<user userName="MAIDIS_UTIL">
<firstName>jean</firstName>
<lastName>maiencore</lastName>
<title>administrateur</title>
<manager></manager>
<personalData/>
<professionalData/>
<password encrypted="false">maidis</password>
<customUserInfoValues/>
</user>
</users>
<roles>
<role name="Medecin">
<displayName>Medecin</displayName>
</role>
<role name="Administrateur structure">
<displayName>Administrateur structure</displayName>
</role>
</roles>
<groups>
<group name="MAIDIS">
<displayName>MAIDIS</displayName>
<description>groupe</description>
</group>
<group name="SIB">
<displayName>SIB</displayName>
<description>groupe 2</description>
</group>
</groups>
<memberships>
<membership>
<userName>Docteur Knock</userName>
<roleName>Administrateur structure</roleName>
<groupName>SIB</groupName>
</membership>
<membership>
<userName>MAIDIS_UTIL</userName>
<roleName>Administrateur structure</roleName>
<groupName>MAIDIS</groupName>
</membership>
<membership>
<userName>MAIDIS_UTIL</userName>
<roleName>Administrateur structure</roleName>
<groupName>SIB</groupName>
</membership>
</memberships>
</organization:Organization>

2 groupes avec 2 rôles différents et 2 utilisateurs dont un (MAIDIS_UTIL) présent dans les 2 groupes
le processus que je veux lancer (Accueil Patient) s'appuie un acteur que j'ai appelé MAIDIS_REST avec le mapping suivant:

<?xml version="1.0" encoding="UTF-8"?>
<actormapping:actorMappings xmlns:actormapping="http://www.bonitasoft.org/ns/actormapping/6.0">
<actorMapping name="MAIDIS_REST">
<groups>
<group>/MAIDIS</group>
<group>/SIB</group>
</groups>
<memberships>
<membership>
<group>/MAIDIS</group>
<role>Medecin</role>
</membership>
<membership>
<group>/MAIDIS</group>
<role>Administrateur structure</role>
</membership>
</memberships>
<roles>
<role>Administrateur structure</role>
<role>Medecin</role>
</roles>
<users>
<user>Docteur Knock</user>
<user>MAIDIS_UTIL</user>
</users>
</actorMapping>
</actormapping:actorMappings>

ma première question concerne la gestion du mapping acteur/organisation: est-ce que les éléments de mapping sont inclusif (l'acteur MAIDIS_REST concerne un des 2 utilisateurs décrits) ou exclusif (il faut alors que tout les conditions soient remplies, et dans ce cas on ne peut mettre qu'un utilisateur)

d'autre part, étant donné la complexité de la gestion des droits, quel serait la configuration à mettre en place pour avoir un "super-utilisateur" qui accèderait à toutes les fonctions de l'outil et tout les composants métiers, sachant que j'ai l'intention d'avoir un frontal applicatif qui aura sa propre gestion de droits

merci pour vos éclaircissements

No answers yet.
Notifications