Serveur d'impression

Gluu – Serveur d’impression

Le 3 mai 2019 - 6 minutes de lecture


                            
                            
                            
                            # Vous trouverez ci-dessous un script d'authentification utilisé par le serveur Gluu pour implémenter Duo Security pour une authentification à deux facteurs (2FA).

depuis org.xdi.service.cdi.util, importez CdiUtil
depuis org.xdi.oxauth.security import Identity
depuis org.xdi.model.custom.script.type.auth, importez PersonAuthenticationType
depuis org.xdi.oxauth.service import UserService, AuthenticationService
depuis org.xdi.service, importez MailService
depuis org.xdi.util, importez ArrayHelper
depuis org.xdi.util import StringHelper

import duo_web
importer json

classe PersonAuthentication (PersonAuthenticationType):
    def __init __ (self, currentTimeMillis):
        self.currentTimeMillis = currentTimeMillis

    def init (self, configurationAttributes):
        print "Duo. Initialization"

        duo_creds_file = configurationAttributes.get ("duo_creds_file"). getValue2 ()
        # Charger les informations d'identification du fichier
        f = open (duo_creds_file, 'r')
        essayer:
            creds = json.loads (f.read ())
        sauf:
            print "Duo. Initialization. Impossible de charger les créations à partir du fichier:", duo_creds_file
            retourne Faux
        enfin:
            f.close ()

        self.ikey = str (creds["ikey"])
        self.skey = str (creds["skey"])
        self.akey = str (creds["akey"])

        self.use_duo_group = False
        if (configurationAttributes.containsKey ("groupe_duo")):
            self.duo_group = configurationAttributes.get ("duo_group"). getValue2 ()
            self.use_duo_group = True
            print "Duo. Initialization. Utiliser Duo uniquement si l'utilisateur appartient au groupe:", self.duo_group

        self.use_audit_group = False
        if (configurationAttributes.containsKey ("groupe_audits")):
            self.audit_group = configurationAttributes.get ("audit_group"). getValue2 ()

            if (pas configurationAttributes.containsKey ("audit_group_email")):
                print "Duo. Initialization. La propriété audit_group_email n'est pas spécifiée"
                retourne Faux

            self.audit_email = configurationAttributes.get ("audit_group_email"). getValue2 ()
            self.use_audit_group = True

            print "Duo. Initialization. Utilisation de audito group:", self.audit_group
            
        if (self.use_duo_group ou self.use_audit_group):
            if (pas configurationAttributes.containsKey ("audit_attribute")):
                print "Duo. Initialization. La propriété audit_attribute n'est pas spécifiée"
                retourne Faux
            autre:
                self.audit_attribute = configurationAttributes.get ("audit_attribute"). getValue2 ()

        print "Duo. Initialisé avec succès"
        retourne True

    def destroy (self, configurationAttributes):
        print "Duo. Destroy"
        print "Duo. Détruit avec succès"
        retourne True

    def getApiVersion (auto):
        retour 1

    def isValidAuthenticationMethod (self, usageType, configurationAttributes):
        retourne True

    def getAlternativeAuthenticationMethod (self, usageType, configurationAttributes):
        retourner Aucun

    def authenticate (self, configurationAttributes, requestParameters, step):
        duo_host = configurationAttributes.get ("duo_host"). getValue2 ()

        authenticationService = CdiUtil.bean (AuthenticationService)

        identity = CdiUtil.bean (Identity)

        si (étape == 1):
            print "Duo. Authentifiez-vous pour l'étape 1"

            credentials = identity.getCredentials ()
            nom_utilisateur = credentials.getUsername ()
            mot_de_passe_utilisateur = credentials.getPassword ()

            logs_in = Faux
            if (StringHelper.isNotEmptyString (nom_utilisateur) et StringHelper.isNotEmptyString (mot_utilisateur_utilisateur)):
                userService = CdiUtil.bean (UserService)
                log_in = authenticationService.authenticate (nom d'utilisateur, mot de passe utilisateur)

            si (non connecté):
                retourne Faux

            utilisateur = authenticationService.getAuthenticatedUser ()
            si (self.use_duo_group):
                print "Duo. Authentifiez-vous à l'étape 1. Vérification de l'appartenance de l'utilisateur au groupe Duo"
                is_member_duo_group = self.isUserMemberOfGroup (utilisateur, self.audit_attribute, self.duo_group)
                if (is_member_duo_group):
                    print "Duo. Authentifiez-vous à l'étape 1. Utilisateur '" + utilisateur.getUserId () + "' membre du groupe Duo"
                    duo_count_login_steps = 2
                autre:
                    self.processAuditGroup (utilisateur)
                    duo_count_login_steps = 1

                identity.setWorkingParameter ("duo_count_login_steps", duo_count_login_steps)

            retourne True
        elif (step == 2):
            print "Duo. Authentifiez-vous à l'étape 2"
            utilisateur = authenticationService.getAuthenticatedUser ()
            si utilisateur == Aucun:
                print "Duo. Authentifiez-vous à l'étape 2. Echec de la détermination du nom d'utilisateur"
                retourne Faux

            nom_utilisateur = utilisateur.getUserId ()

            sig_response_array = requestParameters.get ("sig_response")
            si ArrayHelper.isEmpty (sig_response_array):
                print "Duo. Authentifiez-vous à l'étape 2. sig_response est vide"
                retourne Faux

            duo_sig_response = sig_response_array[0]

            print "Duo. Authentifiez-vous à l'étape 2. duo_sig_response:" + duo_sig_response

            nom_utilisateur_authentifié = duo_web.verify_response (self.ikey, self.skey, self.akey, duo_sig_response)

            print "Duo. Authentifiez-vous à l'étape 2. nom d'utilisateur authentifié:" + nom d'utilisateur authentifié + ", nom d'utilisateur attendu:" + nom d'utilisateur

            if (non StringHelper.equals (nom d'utilisateur, nom d'utilisateur authentifié)):
                retourne Faux

            self.processAuditGroup (utilisateur)

            retourne True
        autre:
            retourne Faux

    def prepareForStep (self, configurationAttributes, requestParameters, step):
        identity = CdiUtil.bean (Identity)
        authenticationService = CdiUtil.bean (AuthenticationService)

        duo_host = configurationAttributes.get ("duo_host"). getValue2 ()

        si (étape == 1):
            print "Duo. Préparez-vous pour l'étape 1"

            retourne True
        elif (step == 2):
            print "Duo. Préparez-vous pour l'étape 2"

            utilisateur = authenticationService.getAuthenticatedUser ()
            si (utilisateur == aucun):
                print "Duo. Préparez-vous pour l'étape 2. Echec de la détermination du nom d'utilisateur"
                retourne Faux
            nom_utilisateur = utilisateur.getUserId ()

            duo_sig_request = duo_web.sign_request (self.ikey, self.skey, self.akey, nom d'utilisateur)
            print "Duo. Préparez-vous pour l'étape 2. duo_sig_request:" + duo_sig_request
            
            identity.setWorkingParameter ("duo_host", duo_host)
            identity.setWorkingParameter ("duo_sig_request", duo_sig_request)

            retourne True
        autre:
            retourne Faux

    def getExtraParametersForStep (self, configurationAttributes, step):
        retourner Aucun

    def getCountAuthenticationSteps (self, configurationAttributes):
        identity = CdiUtil.bean (Identity)
        if (identity.isSetWorkingParameter ("duo_count_login_steps")):
            return identity.getWorkingParameter ("duo_count_login_steps")

        retour 2

    def getPageForStep (self, configurationAttributes, step):
        si (étape == 2):
            retourne "/auth/duo/duologin.xhtml"
        revenir ""

    def logout (self, configurationAttributes, requestParameters):
        retourne True

    def isUserMemberOfGroup (self, utilisateur, attribut, groupe):
        is_member = False
        member_of_list = user.getAttributeValues ​​(attribut)
        if (member_of_list! = None):
            pour member_of dans member_of_list:
                si StringHelper.equalsIgnoreCase (group, member_of) ou member_of.endswith (group):
                    is_member = True
                    Pause

        retourne_membre

    def processAuditGroup (self, user):
        si (self.use_audit_group):
            is_member = self.isUserMemberOfGroup (utilisateur, self.audit_attribute, self.audit_group)
            if (is_member):
                print "Duo. Authentifiez-vous pour processAuditGroup. User '" + user.getUserId () + "' membre du groupe d'audit"
                print "Duo. Authentifiez-vous pour processAuditGroup. Envoi d'un courrier électronique concernant l'utilisateur '" + user.getUserId () + "' se connecter à", self.audit_email
                
                # Envoyer un e-mail à l'administrateur
                user_id = user.getUserId ()
                mailService = CdiUtil.bean (MailService)
                subject = "Connexion de l'utilisateur:" + user_id
                body = "Connexion utilisateur:" + user_id
                mailService.sendMail (self.audit_email, sujet, corps)    
                            

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.