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

Windows Presentation Foundation Discussion :

Gestion des droits dans une appli


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut Gestion des droits dans une appli
    Bonjour à tous,

    Chaque fonctionnalité de mon application sera accessible ou non en fonction du type de mon utilisateur (user/admin).
    L'administrateur a acès à tout (normal ) et l'utilisateur seulement à certains droits
    Seul un administrateur peut dire si une fonctionnalité est disponible pour les utilisateurs.

    Je voulais utiliser un dictionnaire de ressource que je change dynamiquement en fonction du type d'utilisateur et jouer avec un boolean pour afficher ou non un bouton...
    Ainsi par exemple, un bouton x avec le code xaml suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IsEnabled="{DynamicResource AccesX}"
    Donc j'aurais en gros un fichier Admin.xaml et un User.xaml. Jusqu'à là pas de soucis particulier.

    Or, dans mon exemple, l'AccesX appartient à une catégorie Cat1. Mais l'administrateur peut dire que finalement c'est Cat2. C'est là que ça coince...

    En gros, j'arrive à tout stocker dans un fichier xml

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <Categorie>Cat1</Categorie>
    <Action Name="Acces1">True</Action>
    ...

    Donc pour modifier le nom, ben je charge tout dans un treeview et la modification est possible, ensuite j'enregistre le tout en xml (sérialisation).

    Mais comment faire pour le charger et pouvoir l'utiliser comme une ressource dynamique ? De la manière la plus simple possible, car en plus lourd ya l'option d'avoir un objet utilisateur en cache dans toutes mes viewmodels et de binder sur une de ses options...

    Je suis preneur si quelqu'un a une idée ou tout simplement un autre système à proposer, je suis pas sûr que j'ai choisi la meilleure option donc ...

    Voilà, par avance merci !!

    @+

  2. #2
    Membre émérite Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Par défaut
    Bonjour,

    Si tu "écrases" une valeur dans le dictionnaire de ressource et si un objet y faisait référence via le mécanisme de ressources dynamiques alors celui-ci sera mis à jour.

    Par "écrase" j'entends replacer un objet avec la même clef dans le dictionnaire de ressources.

    Bon courage,

  3. #3
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Merci de ton retour rapide !

    Par rapport à ce que tu m'as répondu, j'ai 2 questions dessus.

    Je pensais que les resourcedictionnary était seulement en lecture seule (je m'en sers pour la localization de mon application).
    Est-il alors possible de modifier une valeur dans un objet de sorte qu'au prochain démarrage de l'application, la nouvelle valeur soit conservée ?


    Autre question ; actuellement je stocke des données ainsi :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <System:String x:Key="MyKey">MyValue</System.String>

    Est-il possible de pouvoir stocker un autre attribut en créant soit-même une balise, genre

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <MyBalise x:Key="MyKey" Tag="MyTag">MyValue</MyBalise>

    Si oui, serait-il possible d'avoir un exemple de création de son propre "objet" ?

    Par avance, MERCI

  4. #4
    Membre émérite Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Par défaut
    Citation Envoyé par koyot3 Voir le message
    Je pensais que les resourcedictionnary était seulement en lecture seule (je m'en sers pour la localization de mon application).
    Ils ne sont pas en lecture seule. Cependant ils sont stockées, habituellement, sous la forme de fichier binaire contenu dans ton executable. Rien ne t'empêche cependant de les stocker à côté de ton executable au format XAML et de les mettre à jour en conséquence. Il faudra cependant sauvegarder le dictionnnaire que tu as en mémoire sur le disque à la fermeture de l'application.


    Citation Envoyé par koyot3 Voir le message
    Est-il possible de pouvoir stocker un autre attribut en créant soit-même une balise, genre

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <MyBalise x:Key="MyKey" Tag="MyTag">MyValue</MyBalise>
    C'est un dictionnaire et tu peux donc stocker ce que tu veux dedans. N'importe quel type d'objet ! Il faut déclarer un namespace pointant vers l'assembly contenant ton objet au préalable et ensuite tu les déclares comme tu le fais pour tes strings:

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
     <local:MaClasse x:Key="maClasse" />

    Bon courage !

  5. #5
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Ok nickel merci
    Par contre, juste une précision : le fichier .xaml qui est sauvegardé sur le disque est donc visible par l'utilisateur (éditable, suppression, ...) n'y a t-il aucun moyen de pouvoir stocker des variables modifiables dans l'application directement (fichier resx ?)

    Car dans mon cas je vais avoir un fichier .xaml par type d'utilisateur et donc potentiellement ça peut faire plusieurs fichiers sur le disque...

    Par avance, merci !

  6. #6
    Membre éclairé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Par défaut
    Bon je pense avoir peut être une solution, utiliser des fichiers Settings.
    Je crois que c'est non éditable de l'extérieur (donc assez sécurisé), possibilité de les sauvegarder suite à une modification, ...

    Qu'en pensez-vous ?
    Bonne solution ou il y a mieux ?

    edit : petite question avec les MarkupExtension
    J'ai une classe Class qui possède une propriété stockant un objet qui est en fait un fichier Settings.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    protected Object _obj = SettingsType1.Default;
    public  Object obj
    {
    get { return _obj; }
    set { _obj = value; OnPropertyChanged("obj"); }
     }

    En fonction de mon utilisateur, je change la valeur de cette objet afin qu'il bascule entre SettingsType1 et SettingsType2

    Je l'utilise ainsi dans mon Xaml

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    Text="{Binding Source={StaticResource Class}, Path=obj.MyKey}

    J'ai voulu tester une markup extension pour simplifier l'écriture. Ca donne :

    Code c# : 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
     [MarkupExtensionReturnType(typeof(string))]
        public class MyExtension : MarkupExtension
        {
            public string key { get; set; }
     
            public MyExtension()
            {     
            }
     
            public override object ProvideValue(IServiceProvider serviceProvider)
            {
                Class lvm = ((Class)Application.Current.Resources["loc"]);
                if (lvm.obj is SettingsType1)
                    return ((SettingsType1)lvm.obj).Properties[key].DefaultValue.ToString();
                else
                    return ((SettingsType2)lvm.obj).Properties[key].DefaultValue.ToString();      
            }
        }

    Voilà en gros le principe...
    Appelé ainsi dans mon xaml

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    Text="{root:MyExtension key=MyKey}"

    Seul, hic, lorsque je change la propriété obj de ma classe (branchement sur un autre fichier Setting), la mise à jour du binding n'est pas effective...

    Quelqu'un aurait-il une idée pour me dépanner ?

    Par avance, merci !!

    @+

Discussions similaires

  1. gestion des accès dans une appli VB6
    Par bricew dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/04/2008, 08h49
  2. Gestion des droits dans une application Java
    Par Donaldo dans le forum Langage
    Réponses: 10
    Dernier message: 14/02/2008, 18h15
  3. gestion des utilisateurs dans une solution 3-tiers
    Par nadia lydia dans le forum Oracle
    Réponses: 3
    Dernier message: 26/10/2005, 12h58
  4. [Conception] Gestion des accents dans une base de données
    Par MiJack dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 07/07/2005, 11h41
  5. [VB6] Gestion des erreurs dans une dll
    Par zimba-tm dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 02/08/2004, 11h20

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