Modification du mot de passe provisoire est proposée à la deuxième connexion et non pas à la première connexion

Bonjour,

Nous avons créé un objet CmpPersonne qui est en relation 1.n avec l’objet User. D’autres objets qui définissent des personnes particulières héritent de l’objet CmpPersonne. à la création d’une personne particulière par exemple “CmpCoordinateurTerritorial”. La fonction postCreate de l’objet créé appelle la fonction postCreate mère de l’objet “CmpPersonne” où on récupère notre personne, on l’affecte au groupe ConditionUtilisation pour qu’il soit redirigé vers la page d’accueil des conditions d’utilisations à accepter, où on crée l’utilisateur dans l’objet user et on le lie avec notre personne à travers sa clé technique. Le code fonctionnait bien au début. ça permettait qu’à la première connexion on soit redirigé vers la page de modification de mot de passe provisoire. Et depuis un certain temps, on n’est plus redirigé à la première connexion mais plutôt à la deuxième connexion même si à la première connexion aucune action n’est faite, il suffit de se déconnecter et se reconnecter une 2ème fois pour qu’on puisse avoir le formulaire de changement de mot de passe provisoire. Nous utilisons la versions 5.1.4. Avez vous une idée s’il vous plait ?

image

// fonction posteCreate de l'objet CmpPersonne

	@Override
	public String postCreate() {
	
		try{
			
			//Déclaration des objets de création
			ObjectDB objUser = getGrant().getTmpObject("User");
			BusinessObjectTool objUserT = objUser.getTool();
			
			ObjectDB objPsn = getGrant().getTmpObject("CmpPersonne");
			BusinessObjectTool objPsnT = objPsn.getTool();
			
			ObjectDB objCondition = getGrant().getTmpObject("CmpConditionUtilisation");
			BusinessObjectTool objConditionT = objCondition.getTool();
			
			String mdpTemporaire;
			// Récupération du nom+Preno+Email
			String email = getFieldValue("cmpPsnEmail");
			String prenom = getFieldValue("cmpPsnPrenom");
			String nom = getFieldValue("cmpPsnNom");
			if (!objUserT.getForUpsert​(new JSONObject().put("usr_login", email))) 
			{
				// Set functional keys fields
				objUser.setFieldValue("usr_login", email);
				objUser.setFieldValue("usr_email", email);
				objUser.setFieldValue("usr_last_name", nom);
				objUser.setFieldValue("usr_first_name", prenom);
				objUserT.validateAndCreate();
			}
			
			String userId = getGrant().getUserId(email);

			if(!(userId.isEmpty()) && objPsnT.getForUpsert​(new JSONObject().put("cmpPsnEmail", email)))
			{
				objPsn.setFieldValue("cmpPsnUsrId",userId);
				objPsnT.validateAndSave();
			}
			
			Grant.addResponsibility(userId, "CMP_ConditionUtilisation", null, null, true, "Campus");
			if (!objConditionT.getForUpsert​(new JSONObject().put("CmpConditionUtilisation_User_id", userId)))
			{
				// Set functional keys fields
				objCondition.setFieldValue("CmpConditionUtilisation_User_id", userId);
				// Set Terms text value
				objCondition.setFieldValue("cmpCondition", "Les CGU représentent le contrat entre l’éditeur du site et l’internaute utilisateur, aussi pour être valables, tout comme les CGV, les CGU doivent être acceptées (comme être présentées à l’utilisateur après sa première connexion au site) et être présentes sur chaque page (lien permanent accessible depuis chaque page)");
				objConditionT.validateAndCreate();
			}
			
			mdpTemporaire = generatePassword();
			getGrant().changePassword(email, mdpTemporaire, true, true);
			// code HTML à modifier uilisé seulement pour les tests
			String bonjourNomPersonne = "<p>Bonjour\t"+getFieldValue("cmpPsnPrenom")+",</p><br>";
			String introLienCampus ="<p>Afin de faciliter vos démarches liées à Campus 2023, vous disposez d’un accès personnel et sécurisé qui vous est dédié sur la plateforme en ligne https://www.campus...</p><br><p>Voici vos identifiants: </p> ";
			String identifiants = "<p>login:\t"+email+"</p><br><p>Mot de passe provisoire (à personnaliser au moment de votre première connexion) :\t"+mdpTemporaire+"</p><br>";
			String formulePolitesseSignature = "<p>Bienvenue et bonne navigation!</p><br><p> L’équipe Campus 2023</p>";
				
			// Envoi de mail à la création 
			MailTool mail = new MailTool(getGrant());
			mail.addRcpt(email);
			mail.setSubject("Bienvenue chez xxxxxx");
			mail.setBody(bonjourNomPersonne+introLienCampus+identifiants+formulePolitesseSignature);
			mail.send();
			

		}
		 catch (Exception e) {
			AppLog.error(e, getGrant());
		}

		return null;
	}
// classe CmpConditionTerritorial avec la classe postCreate
public class CmpCoordinateurterritorial extends ObjectDB {
	private static final long serialVersionUID = 1L;
	
	@Override
	public String postCreate() {
		// Appel de la fonction Post Create de la classe CmpPErsonne
		super.postCreate();
		return null;
	}
}

Sans rentrer dans le détail de votre cas le code suivant est douteux:

Votre classe hérite de ObjectDB donc le super.postCreate() que vous appelez ne peut pas être celui de CmpPersonne comme vous l’écrivez.

En outre si votre méthode ne retourne pas ce que retourne le super.postCreate() vous zappez ce qu’elle retourne éventuellement => Il faut écrire plutôt return super.postCreate().

Mais dans ce cas si vous ne faites rien de plus qu’appeler le super implémenter cette surcharge ne sert à rien…

A priori il suffit donc de mettre l’extend qui va bien et le code de la classe super sera bien appelé, ex:

public class CmpCoordinateurterritorial extends CmpPersonne {
	private static final long serialVersionUID = 1L;
}

J’ai choisi le mauvais exemple pour mon cas. Cet objet vient d’être supprimé et recréé récemment je l’ai utilisé car il ne contenait pas beaucoup de code enfin pour une meilleur visibilité, merci en tout cas pour la remarque. J’ai bel et bien fait mes tests sur différents objets qui héritent de la classe CmpPersonne " extends CmpPersonne". Ce n’est pas non plus un mauvais appel à la super Fonction PostCreate car le contenu s’exécutait parfaitement ( d’ailleurs je viens de refaire le test en modifiant le return super.postCreate(); ). Pour simplifier les choses, J’ai mis ce code de la postCreate de la classe CmpPersonne ici pour éviter de dupliquer le code partout. Je l’ai même testé directement en l’intégrant dans la postCreate() de ma classe fille ( il fonctionne correctement) mais le fonctionnement bizarre à la première connexion qui ne me propose pas directement la modification du mot de passe persiste. Ce n’est donc pas un problème d’héritage ni de faux appel de la fonction mère postCreate.

L’obligation de changer son mot de passe est conditionné par le paramètre utilisateur FORCE_CHANGE_PASSWORD qui est vérifié au moment de la connexion = lorsque l’utilisateur se reconnecte explicitement après s’être déconnecté explicitement.

Vérifiez que dans votre cas ce paramètre est bien valorisé (à yes) pour l’utilisateur concerné dans votre contexte de création/modification.

Si oui (et que rien ne vient supprimer ce paramètre utilisateur) il n’y a pas de raison que cet utilisateur ne soit pas obligé de changer son mot de passe la prochaine fois qu’il se connectera.

J’ai bien vérifié ce paramètre il est bien initialisé à yes comme tu le verras sur les captures d’écrans. Mais le problème persiste, l’utilisateur n’a pas la possibilité de changer de mot de passe à sa 1ère connexion mais plutôt à sa 2ème connexion.


L’utilisateur doit aussi avoir le droit de changer son mot de passe = avoir une responsabilité (active) sur le groupe USER_PASSWORD

Effectivement, il ne l’avait pas. je lui ai bien rajouté à sa connexion mais le problème persiste:

Voici à quoi ressemble les paramètres utilisateurs après la première connexion contrairement à la capture sur le message d’avant avant sa première connexion ( si ça peut aider):

On est bien d’accord qu’on parle d’une “vraie” connexion interne du user en question pour ce que vous désignez comme la “première connexion” = il arrive sur la page de login Simplicité où tape son username et password ?

Je pose la question car le mécanisme de changement de mot de passe n’a bien entendu pas de sens avec une connexion via un IdP externe et n’est pas appliqué via une “pseudo” connexion en “god mode” etc. Pour être sûr de ne pas être dans un cas atypique, faites le test de “première connexion” dans une fenêtre de navigation privée.

Bonjour David,
Quand je parle de “première connexion” c’est un utilisateur externe qui vient de recevoir ses identifiants + mdp par mail. Il entame par la suite l’étape d’authentification. il mentionne pour la première fois son login + mdp. Une fois ses identifiants sont validés, il est sensé être redirigé avant toute chose vers le formulaire qui l’oblige à changer son mot de passe temporaire. au lieu de ça il passe directement à la page d’acceptation des conditions d’utilisations ( l’utilisateur peut rester connecté aussi longtemps qu’il le veut ) Une fois qu’il se déconnecte et qu’il se reconnecte, c’est à ce moment là qu’on l’oblige à changer son mot de passe provisoire. J’ai testé en navigation privé et sur différents postes de travail.

Ce que je comprend de ce que vous indiquez c’est qu’on parle d’une customisations du processus de connexion pour passer d’abord par une page spécifique.

Je ne sais pas comment vous avez mis ça en place (platform hooks ?) mais c’est sans doute de ce coté qu’il faut chercher la raison du comportement résultant

Si vous avez suivi les conseil de quelqu’un de l’équipe pour la mise en place de ce processus, je vous conseille de le consulter directement via message privé ou en indiquant ici son username ici en @…

Bonjour @Alistair, On reprend le sujet ensemble s’il te plait

@Alistair J’ai procédé aux tests que tu m’as demandé. Et donc, la fonction getGrant().changePassword(email, mdpTemporaire, true, true); permet à la modification de forcer le changement de mot de passe comme à la création le paramètre système force_change_password passe à yes. Le problème provient surement à la création mais n’a aucun rapport avec le paramètre système force_change_password

Bonjour Mehdi,

Je viens de faire quelques tests sur votre instance et, en isolant la partie création de l’utilisateur du reste du code qu’il y a dans le postCreate de l’objet CmpPersonne. La modification du mdp est bien demandée à la première connexion.
J’ai remarqué qu’il y avait pas mal d’erreurs dans les logs à la création d’une personne, l’objet qui semble poser problème est CmpProblemeTechnique. Je te laisse regarder.

Bonjour Alistair,

J’ai refait le test et la demande de modification de mot de passe se fait à la deuxième connexion non à la première connexion. Le mieux est qu’on regarde ça ensemble, je te propose mes disponibilités par mail.

Je t’invite à regarder les logs ainsi que le paramétrage de l’objet CmpProblemeTechnique, la relation entre cet objet et l’objet CmpPersonne se fait via l’attribut acf_activity_id, cet attribut est un attribut du module Workflow, il n’a rien à faire là.

@Mehdi Après plus de tests, je me rends compte que c’est peut etre la méthode addResponsibility qui pose problème, je te tiens au courant rapidement.

D’accord merci @Alistair

@Mehdi En ajoutant une home à l’utilisateur que tu crées, ça fonctionne correctement.

Je viens de changer le code sur votre instance de dev :
objUser.setFieldValue("usr_home_id", View.getViewId("CmpConditionUtilisation"));

Je te laisse valider que ça fonctionne correctement.

Merci @Alistair ça fonctionne parfaitement :smiley:

This topic was automatically closed 60 minutes after the last reply. New replies are no longer allowed.