Serveur d'impression
Gluu – Serveur d’impression
# 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