IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

W4 Express Java Discussion :

Gestion de profils utilisateur


Sujet :

W4 Express Java

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2006
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 105
    Points : 126
    Points
    126
    Par défaut Gestion de profils utilisateur
    Bonjour,
    J'ai une application avec plusieurs types d'utilisateur différents (administrateur, confirmé, novice...).
    Quelle est la solution pour implémenter une gestion de droits utilisateurs (par exemple, réserver la création/modif./suppression des utilisateurs au seul administrateur) ?
    D'avance merci pour votre aide.
    A+

  2. #2
    Membre habitué Avatar de Capt'n Java
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 146
    Points
    146
    Par défaut
    Le principe de base va être d'utiliser un comportement de session spécifique (héritage de LySessionBehavior) et de surcharger les méthodes enableAction(...) pour griser ou dégriser une action et validateAction(...) pour que l'action soit présente ou non.
    Ces 2 méthodes retournent un booléen, il te suffit donc de coder le test du droit de l'action en fonction de l'utilisateur connecté (que tu récupères sur la session avec la méthode getUser()).

  3. #3
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2007
    Messages : 58
    Points : 59
    Points
    59
    Par défaut Exemple de mise en oeuvre par des MARQUES SPECIFIQUES : etape 1 filtrer des ACTIONS
    Il y a plusieurs façons de procéder mais voici que que je fais dans les cas simples.

    On suppose ici que j'ai des utilisateurs et que les utilisateurs ont des roles.
    (c'est une relation vers des roles mais en cas de champ du type CHOICE c'est identique).

    Dans studio sur chaque action que je veux réserver à ROLE_ADMIN ou ROLE_COMMERCIAL par exemple, je sélectionne l'action > marque spécifique et on met la ou les marques correspondantes. Les noms des marques sont libres mais ayez une convention de nommage simple;

    exemple de resultat dans les fichiers XML :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    		<ACTION id="Action_Table_Users" template="_table">
    			<NAME value="NAME_ACTION_TABLE_USERS"/>
    			<ALIAS value="ALIAS_ACTION_TABLE_USERS"/>
    			<GROUP value="GROUP_ACTION_TABLE_USERS"/>
    			<PREFIX value="user"/>
    			<A_MARKS>
    				<MARK name="ROLE_ADMIN"/>
    			</A_MARKS>
    			<PARAMETER name="_classInfo" idref="User"/>
    		</ACTION>
    Ensuite, dans Studio sélectionner le projet de l'abre de navigation et clic droit > comportement de session.

    Vous pouvez tout supprimer sauf validateAction (qui cache les actions interdites) et enableAction qui les grise :

    Exemple de code :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    public class SessionBehavior extends LySessionBehavior
    {
    	/**
             * Validates the given action for the given controller.
             *
             * @param  session    the current session
             * @param  action     the action to validate
             * @param  controller the controller for this action
             * @return true if the action is valid, false otherwise.
             * @see leon.app.behaviorinterface.LySessionBehaviorInterface#validateAction
             */
    	public boolean validateAction(LySession session, LyAction action, LyController controller)
    	{
    		int ROLE_COMMERCIAL_MARK = LyAction.getMark("ROLE_COMMERCIAL");
    		int ROLE_ADMIN = LyAction.getMark("ROLE_ADMIN");
     
    		if (action.hasMark(ROLE_COMMERCIAL_MARK))
    		{
    			// L'action a la marque spécifique ROLE_COMMERCIAL, autorisée si et seulement si l'utilisateur à le role commercial
    			LyObject user = session.getUser();
     
    			if (user == null)
    				return false;
     
    			LyObject role = user.getRelationValue("user_role").getObject(0);
     
    			if (role == null)
    				return false;
     
    			String roleName = role.getName();
     
    			if ((!"Commercial".equals(roleName)) && (!"Admin".equals(roleName)))
    				return false;
    		}
    		if (action.hasMark(ROLE_ADMIN))
    		{
    			// L'action a la marque spécifique ROLE_ADMIN, autorisée si et seulement si l'utilisateur à le role admin
    			LyObject user = session.getUser();
     
    			if (user == null)
    				return false;
     
    			LyObject role = user.getRelationValue("user_role").getObject(0);
     
    			if (role == null)
    				return false;
     
    			String roleName = role.getName();
     
    			if (!"Admin".equals(roleName))
    				return false;
    		}
     
    		return super.validateAction(session, action, controller);
    	}
     
    	public boolean enableAction(LySession session, LyAction action, LyController controller, LyObjectList objects, boolean showError) {
    		if (!validateAction(session, action, controller))
    			return false;
    		return super.enableAction(session, action, controller, objects, showError);
    	}
     
    }

    ---> voila, il ne vous reste plus qu'a placer les marques adéquates sur les actions pour les autoriser ou pas sans modifier le code source.

  4. #4
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2007
    Messages : 58
    Points : 59
    Points
    59
    Par défaut Exemple de mise en oeuvre par des MARQUES SPECIFIQUES: etape 2 champs des FORMULAIRES
    Suite du message précédent mais pour les formulaires,
    on met des marque spécifiques exactement comme pour les actions (on peut d'ailleurs utiliser les mêmes).

    Sélectionner la classe que l'on veut filtrer, clic droit > comportement de classe.

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    public class MyClassBehavior extends LyClassBehavior
    {
     
    public boolean isDisplayed(LyFormController form, LyFieldInfo fieldInfo) 
    	{
    		int ROLE_COMMERCIAL_MARK = LyFieldInfo.getMark("ROLE_COMMERCIAL");
     
    		if (fieldInfo.hasMark(ROLE_COMMERCIAL_MARK))
    		{
    			LySession session = form.getSession();
     
    			// L'attribut  a la marque spécifique ROLE_COMMERCIAL, autorisée si et seulement si l'utilisateur a le role commercial
    			LyObject user = session.getUser();
     
    			if (user == null)
    				return false;
     
    			LyObject role = user.getRelationValue("user_role").getObject(0);
     
    			if (role == null)
    				return false;
     
    			String roleName = role.getName();
     
    			if ((!"Commercial".equals(roleName)) && (!"Admin".equals(roleName)))
    				return false;
    		}
    		return super.isDisplayed(form, fieldInfo);
    	}
     
    	public boolean isEditable(LySetController set, LyFieldInfo fieldInfo) 
    	{
    // on peut faire exactement la même chose ici pour les rendre en lecture seule au lieu de les cacher.
    		return super.isEditable(set, fieldInfo);
    	}
     
    }

    Pour cacher les champs dans une TABLE : sélectionner l'action table > comportement de l'action et voici un exemple de comprtement de table :
    REMARQUE : j'ai copié collé pour plus de simplicité mais on peut factoriser le code de gestion des droits dans une classes Java partagée bien sûr.

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    public class MyTableBehavior extends LyTableBehavior
    {
    	LyInfoList _availableFields;
     
    	/**
             * Gets the list of fields to display in the table from the given list.
             *
             * @param  tableController the table controller that requires the list
             * @param  fields          a list of fields from where fields to display are taken
             * @return The list of fields to display in the table.
             * @see leon.app.behaviorinterface.LyTableBehaviorInterface#getFields
             */
    	public LyInfoList getFields(LySimpleTableController tableController, LyInfoList fields)
    	{
    		if (fields != null)
    		{
    			for (int i=fields.getSize()-1; i>=0; i--)
    			{
    				LyFieldInfo fieldInfo = (LyFieldInfo)fields.getInfo(i);
     
    				if (!isDisplayed(tableController, fieldInfo))
    					fields.removeInfo(fieldInfo);
    			}
    		}
    		_availableFields = fields;
    		return fields;
    	}
    	public boolean isDisplayed(LyController form, LyFieldInfo fieldInfo) 
    	{
    		int ROLE_COMMERCIAL_MARK = LyFieldInfo.getMark("ROLE_COMMERCIAL");
     
    		if (fieldInfo.hasMark(ROLE_COMMERCIAL_MARK))
    		{
    			LySession session = form.getSession();
     
    			// L'attribut  a la marque spécifique ROLE_COMMERCIAL, autorisée si et seulement si l'utilisateur a le role commercial
    			LyObject user = session.getUser();
     
    			if (user == null)
    				return false;
     
    			LyObject role = user.getRelationValue("user_role").getObject(0);
     
    			if (role == null)
    				return false;
     
    			String roleName = role.getName();
     
    			if ((!"Commercial".equals(roleName)) && (!"Admin".equals(roleName)))
    				return false;
    		}
    		return true;
    	}
    	/**
             * Gets the list of fieldinfos that may be displayed in the column chooser tool.
             *
             * @param  controller Table controller that requires the list.
             * @return the list of fields to display in the column chooser tool or null to let the
             *         controller build this list.
             * @see leon.app.behaviorinterface.LyTableBehaviorInterface#getChooseColumnsFieldInfos
             */
    	public LyInfoList getChooseColumnsFieldInfos(LySimpleTableController controller)
    	{
    		return _availableFields;
    	}
     
    }

  5. #5
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2007
    Messages : 58
    Points : 59
    Points
    59
    Par défaut Etape 3 : filtrer les DONNES affichées
    Une fois que l'on a restreint l'accès à certaines actions, et à certains champs, il reste le problème des données.
    Tout le monde ne peut pas tout voir.

    Ce filtrage est certes spécifique à chaque application mais prenons ici le cas classique, en fin de login on veut filtrer les données de a classe :
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    /**
     * This interface defines the methods to implement in order to manage the login of a user.
     *
     * @author  Lyria S.A.
     * @version $Id: LyLoginBehaviorInterface.java,v 6.3 2007/02/07 15:51:39 jls Exp $
     * @see     LyLoginController
     */
    public class LoginBehavior extends LyLoginBehavior
    {
    	/**
             * Default Constructor
             */
    	public LoginBehavior()
    	{
    	}
     
    	/**
             * Ends the login.
             *
             * @param loginController current controller
             * @param values          extra values from the login controller validation.
             * @see leon.app.behaviorinterface.LyLoginBehaviorInterface#endLogin
             */
    	public void endLogin(LyLoginController loginController, LyParameterValues values)
    	{
    		if (loginController.getStatus() == LyLoginController.STATUS_LOGIN_OK) 
    		{ 
    			// Recuperer le user --> role --> zone
    			LySession session = loginController.getSession();
    			LyObject  user = session.getUser(); 
     
    			if (user != null)
    			{
    				LyObject role = user.getRelationValue("user_role").getObject(0);
     
    				if (role != null)
    				{
    					LyObject zone = role.getRelationValue("role_visu").getObject(0);
     
    					if ((zone != null) && (!zone.getName().equals("ALL")))
    					{
    						  LyClassInfo clientClassInfo = loginController.getClassInfo("client_cls");
     
    						  LyFilter 			filterZone = new LyFilter();
    						  LyFilterExpression exp = new LyFilterExpression(clientClassInfo.getFieldInfo("client_zone"), LyFilterExpression.COND_EQUALS, zone.getName());
    						  filterZone.addElement(exp);
     
    						  LyFilteredObjectSource fos = new LyFilteredObjectSource(session, clientClassInfo, filterZone); 
    					}
    				}
    			}
    		}
    		super.endLogin(loginController, values);
    	}
    }

  6. #6
    Membre habitué Avatar de Capt'n Java
    Inscrit en
    Juin 2007
    Messages
    122
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 122
    Points : 146
    Points
    146
    Par défaut
    Ca fait quand même beaucoup de code
    Et en plus si il y a une nouvelle fonctionnalité dans Leonardi il faudra ajouter le code pour prendre en compte les rôles
    Ce serait bien s'il y avait une gestion des droits centralisée (du style une seule interface à implémenter)

  7. #7
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2007
    Messages : 58
    Points : 59
    Points
    59
    Par défaut Code
    Oui, à investiguer, mais s'il y a du code il est cependant assez simple et ici cela correspond à 4 cas.
    Le point le plus dommageable je pense est l'absence de point unique pour valider les marques spécifiques indépendant de la nature de ce que l'on veut autoriser.
    Idées en vrac :
    1) un point d'acces central sur la session (LySessionBehavior) pour autoriser l'affichage des champs, des actions, ou des classes (classinfo -> s'applique à tous les champs et toutes les actions de la classinfo) serait bien avec des niveaux de retour comme :
    ACCESS_INVALID, ACCESS_NOT_ENABLED (grisé), ACCESS_READ_ONLY par exemple.

    2) Ce point d'accès dans le LySessionBehavior devrait être pré-codé pour le cas de base pour qu'on n'ait rien d'autre à faire que de mettre des contraintes de "roles" sur les actions et ou des champs.

    * Cas simples :
    a) le role est un CHOICE (énuméré) multiple sur la classe des utilisateurs. les roles sont les valeurs des options.
    --> Dans Studio sur les roles on peut proposer directement la liste des roles possibles
    b) le role est une Relation multiple de la classe des utilisateurs vers une classe roles : les roles sont les noms des objets cibles
    --> Dans Studio les roles sont des chaines de caractères libres.

    * scenario d'utilisation dans Studio (idées en vrac : à améliorer !)
    1) on sélectionne un champ sur une classe (les utilisateurs) et une action "champ donnant les roles (ACL)" permet d'identifier le champ à utiliser.
    2) Si l'étape 1 a été faite une action "définir les roles (ACL)" est proposée sur : actions, champs et classes : elle ouvre une dialogue permettant de choisir :
    * Interdire pour les roles : <tableau de roles>
    * Désactiver pour les rôles : <tableau de roles>
    * Lecture seule pour les roles : <tableau de roles>
    Le tableau des roles est soit une liste des roles connus (cas 1) soit des saisies libres (cas 2)
    3) On enregistre et on peut exécuter.
    Sauvegarde : extension de la grammaire ? ou bien tout simplement en se basant sur des marques spécifiques cachées ?
    Idées bonus : mettre un 'effet graphique' sur les champs ou actions restreintes ?

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    Est ce que l'on doit filtrer les actions, les formulaires, les données ?
    ou on peut filtrer seulement les actions ?
    Par exemple dans mon cas, j'ai une table BDD baptisé "users" avec les champs : usr_login, usr_passwd, usr_role
    j'utilise ceci pour le login (ce qui fonctionne très bien )
    mais je veux que certaine action de mon "tableau de bord" ne soit accessible que au rôle "Admin" !!

  9. #9
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 53
    Points : 57
    Points
    57
    Par défaut
    Oui, tu peux choisi SEULEMENT de cacher une action grâce à la première étape.
    Tu met une marque spécifique (par exemple : "ROLE_ADMIN") sur les actions de ton tableau de bord a filtrer,
    Dans le session behavior, surcharge validateAction([...]) pour choisir de cacher les actions qui ont cette marque aux utilisateurs qui ne sont pas admin.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    OK !! MErci pour le réponse !!
    j'ai un message d'erreur !!
    donc j'ai repris l'exemple du dessus en modifiant les parties nécessaires
    dans ma base de données il y a bien Admin et Commercial tout comme l'exemple donc de ce coté sa devrait être bon !!
    je crois que l'erreur vient de là !!
    LyObject role = user.getRelationValue("user_role").getObject(0);

    user_role => doit être remplacé par quoi ?? j'ai essayer avec l'id "Usersusr_role" de ma classe ou se trouve les roles !
    <CLASS id="usersCls">
    [...] <TEXT id="Usersusr_role">
    <F_BIND value="usr_role" cbind="users"/>
    <NAME value="NAME_USERSUSR_ROLE"/>
    <MAX value='20'/>
    </TEXT>
    [...]
    </CLASS>
    peut être que l'attribut MARK est mal placé !!
    dans navigationTree.xml
    <ACTION id="News_CLS" template="_table">
    <NAME value="NAME_NEWS_CLS"/>
    <GROUP value="A_GROUP_NEWS_CLS_2"/>
    <A_MARKS>
    <MARK name="ROLE_ADMIN"/>
    </A_MARKS>
    <PARAMETER name="_classInfo" idref="newsCls"/>
    </ACTION>
    mais ça me met l'erreur suivant :

    [07/04 10:57:20][WARNING] Leonardi : internal view was already created for component leon.view.swt.LySwtFormField@1cbfa42, returning existing one.
    [07/04 10:57:25][STACK] Leonardi : exception caught in
    leon.app.behavior.LyDataSessionBehavior.handleException(LyDataSessionBehavior.java:235)
    leon.app.LyDataSession.handleException(LyDataSession.java:722)
    leon.app.LySession.invokeAction(LySession.java:759)
    ...
    java.lang.ClassCastException: leon.info.LyTextFieldInfo
    at leon.data.LyObject.getRelationValue(LyObject.java:887)
    at essai.behavior.EssaiSessionBehavior.validateAction(EssaiSessionBehavior.java:69)
    at leon.app.LySession.validateAction(LySession.java:358)
    at leon.control.builder.LyDashboardBuilder.validateAction(LyDashboardBuilder.java:518)
    at leon.control.builder.LyAreaBuilder.buildToolBar(LyAreaBuilder.java:577)
    at leon.control.builder.LyAreaBuilder.addTools(LyAreaBuilder.java:427)
    at leon.control.builder.LyAreaBuilder.buildToolBar(LyAreaBuilder.java:396)
    at leon.control.builder.LyAreaBuilder.completeToolBar(LyAreaBuilder.java:260)
    at leon.control.builder.LyDashboardBuilder.buildToolBar(LyDashboardBuilder.java:190)
    at leon.control.builder.LyDashboardBuilder.build(LyDashboardBuilder.java:69)
    at leon.control.builder.LyBuilder.buildComponent(LyBuilder.java:72)
    at leon.control.builder.LyAreaBuilder.buildComponent(LyAreaBuilder.java:76)
    at leon.control.LyController.getComponent(LyController.java:558)
    at leon.control.builder.LyViewBuilder.buildArea(LyViewBuilder.java:98)
    at leon.control.builder.LyFrameBuilder.build(LyFrameBuilder.java:48)
    at leon.control.builder.LyBuilder.buildComponent(LyBuilder.java:72)
    at leon.control.LyController.getComponent(LyController.java:558)
    at leon.control.LyViewController.getView(LyViewController.java:386)
    at leon.control.LyAreaController.getViewController(LyAreaController.java:2657)
    at leon.control.LyAreaController.getViewController(LyAreaController.java:2604)
    at leon.control.LyController.showView(LyController.java:239)
    at leon.control.LyAreaController.showView(LyAreaController.java:3454)
    at leon.control.LyAreaController.showView(LyAreaController.java:3369)
    at leon.app.LySession.showView(LySession.java:1024)
    at leon.app.LySession.invokeAction(LySession.java:754)
    at leon.control.LyLoginController.invokeNextActions(LyLoginController.java:466)
    at leon.app.behavior.LyLoginBehavior.endLogin(LyLoginBehavior.java:151)
    at leon.control.LyLoginController.checkLogin(LyLoginController.java:382)
    at leon.app.behavior.LyLoginBehavior.userInputDemand(LyLoginBehavior.java:239)
    at leon.control.LyUserInputController.actionDemand(LyUserInputController.java:193)
    at leon.control.LyLoginController.actionDemand(LyLoginController.java:566)
    at leon.control.LyController.demandPerformed(LyController.java:784)
    at leon.view.event.LySimpleDemandTransmitter.process(LySimpleDemandTransmitter.java:149)
    at leon.view.event.LySimpleDemandTransmitter.processDemand(LySimpleDemandTransmitter.java:125)
    at leon.view.LyViewManager.processDemand(LyViewManager.java:1051)
    at leon.view.graphic.LyGraphicalObject.processDemand(LyGraphicalObject.java:319)
    at leon.view.graphic.LyGraphicalObject.processDemand(LyGraphicalObject.java:305)
    at leon.view.swt.LySwtArea.actionPerformed(LySwtArea.java:1365)
    at leon.view.event.LySimpleActionTransmitter.processActionEvent(LySimpleActionTransmitter.java:97)
    at leon.view.swt.LySwtCommands.actionPerformed(LySwtCommands.java:160)
    at leon.view.event.LySimpleActionTransmitter.processActionEvent(LySimpleActionTransmitter.java:97)
    at leon.view.swt.LySwtCommand$_LySwtCommandSelectionListener.widgetSelected(LySwtCommand.java:189)
    at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
    at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
    at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
    at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
    at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
    at leon.view.swt.LySwtViewManager$_LySwtViewManagerEventLoop.run(LySwtViewManager.java:190)

  11. #11
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 53
    Points : 57
    Points
    57
    Par défaut
    c'est parceque ton role est un champ de type texte.
    Au lieu de getRelationValue("<identifiant>").getObject(0), il faut utiliser getTextValue(), qui te renverra une String au lieu d'un LyObject.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 52
    Points : 29
    Points
    29
    Par défaut
    SUPER !!
    tatao3, je te remercie !!
    c'était effectivement tout bête mais je me suis mis à Léonardi que depuis à peine une semaine et par conséquent je n'ai pas eu le temps de maitriser mais grace à la documentation, la pratique et tous les petits coup de pouce des mecs comme vous, j'avance et je suis moins bête de jour en jour !!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion des profils utilisateurs
    Par Roger Didi dans le forum WinDev
    Réponses: 7
    Dernier message: 20/01/2020, 12h42
  2. Recherche un parttern pour la gestion des profils utilisateurs
    Par foufar2009 dans le forum Design Patterns
    Réponses: 2
    Dernier message: 15/04/2011, 19h09
  3. [AC-2010] gestion des profils utilisateur
    Par iboudaaten dans le forum Sécurité
    Réponses: 2
    Dernier message: 08/04/2011, 09h27
  4. Gestion de profils utilisateurs
    Par ben11510 dans le forum SharePoint
    Réponses: 1
    Dernier message: 04/04/2008, 23h19
  5. gestion des profils utilisateurs
    Par boudinga dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 18/12/2007, 02h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo