Verzeker een veilige login via een persoonlijke code

0000002321     -      27-08-2017

Het voorbeeld dat hier is voorgesteld, in Mercator Majuro, zorgt voor de gebruiker login-functionaliteit met behulp van een aangepaste code. Dit wordt gedaan door het benutten van de BeforeLogin gebeurtenis van de MercatorUi.Main. Dit evenement wordt geïnstalleerd bij het openen van het dossier met dank aan het implementeren van de MercatorUi.ICustomizersExecAction en de detectie van de DossierOpenactie.

Het MercatorUi.Main.BeforeLoginEventArgs object type dat passeert voorbij het afgevaardigde BeforeLogin evenement heeft verschillende eigenschappen:

  • LoginMode : vermelding die aangeeft in welk frame de login wordt uitgevoerd:
    • AtStartup : bij het begin
    • FromMenu : Na het veranderen van gebruiker wordt het verzocht bij het menu “Bestand”
    • InSequenceV /  InSequenceA : Als er een opeenvolging is van gebeurtenissen in de verkoop en aankoop
    • OpenCashDrawer : Bij het openen van de kassalade vanuit het “Bestand” menu
  • IdLoggedUser : Indien u wenst wordt het vervolledigd met een gebruikers-ID waarmee de login mee moet worden uitgevoerd.
  • NoAsk : zet deze eigenschap op true als u iets wenst te stoppen dat binnenkomt door de Mercator code.
  • NoHello : Zet deze eigenschap op true als u het “Hello …” tekst venster niet meer wenst te laten verschijnen.

Een voorbeeld volgt hieronder. Het staat ons toe om het mechanisme te begrijpen, maar staat ons als zodanig niet toe om het te gebruiken. Hij ordent werkelijk een selectie gebruikers op basis van een simpel SQL aanvraag. In dat deel van de code is het belangrijk voor u om een login logica te gebruiken die persoonlijk is als voldoet aan de eisen.

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using MercatorApi;
using MercatorUi;

namespace Main
{
    public class Customizer : MercatorUi.ICustomizers.IExec
    {

        public void Main(MercatorUi.ICustomizers.ExecAction Action)
        {
            if (Action == MercatorUi.ICustomizers.ExecAction.DossierOpen)
            {
                Globals.Main.BeforeLogin += new MercatorUi.Main.BeforeLoginEventHandler(Main_BeforeLogin);
            }
            else if (Action == MercatorUi.ICustomizers.ExecAction.DossierClose)
            {
                Globals.Main.BeforeLogin -= new MercatorUi.Main.BeforeLoginEventHandler(Main_BeforeLogin);
            }
        }

        void Main_BeforeLogin(object sender, MercatorUi.Main.BeforeLoginEventArgs e)
        {
            if (e.LoginMode == LoginModeEnum.AtStartup) // uniquement au démarrage de Mercator
            {
                DataSet ds = Api.Zselect(MercatorUi.Globals.RepData, "select id from users where ...");
                if ((ds != null) && (ds.Tables[0].Rows.Count > 0))
                {
                    MercatorUi.Dialogs.Stop("Vous allez entrer dans Mercator en tant que ... !");
                    e.IdLoggedUser = ds.Tables[0].Rows[0]["id"].ToString(); // effectuer le login sur cet utilisateur
                    e.NoAsk = true; // supprimer quoi qu'il arrive la saisie du code par Mercator
                    e.NoHello = true; // Ne pas afficher "Hello ..."
                }
                else
                {
                    MercatorUi.Dialogs.Stop("Accès refusé !");
                    e.NoAsk = true; // supprimer quoi qu'il arrive la saisie du code par Mercator
                }
            }
        }
    }
}

Waarschuwing : Men moet voorzichtig zijn bij het plaatsen van een dergelijke code. Want, een eenvoudige bug of een denkfout in de constructieve van de code kan de start van Mercator voorkomen. In dat geval kan het nodig zijn om de customizer te verwijderen via de SQL gereedschappen. Deze bevinden zich in de ASSEMBLIES tabel waar id CMZER=Main is.

Om deze code goed te laten werken, is het noodzakelijk op NEEN de optie "Login in een aparte start thread" (PRE_LOGIN) te zetten.