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

JSF Java Discussion :

[JSF][Sécurité & PhaseListener] Comment faire ?


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Par défaut [JSF][Sécurité & PhaseListener] Comment faire ?
    Bonjour à toutes et à tous,

    Je développe depuis peu sur les JSF. Je cherche à mettre en place une politique de sécurité (affichage de certains composant suivant différentes données utilisateurs et métiers) et d'intertionalisation. L'idée est appliquer cette politique juste à avant que les composants soient affichés.

    Ma première idée et la seule que j'ai eu pour l'instant est de mettre en place un PhaseListener sur la phase Render Response. voici son code simplifié

    Code : 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
     
    public class SecurityManager implements PhaseListener {
     
      public void beforePhase(PhaseEvent event) {
        // les composants ne sont pas affichés
        // idéal pour mettre les politiques
     
        UIViewRoot racine = phaseEvent.getFacesContext().getViewRoot();
        if (racine == null){
          return;
        }
     
        // Je parcours mon arbre de composants
        for (int index = 0; index < racine.getChildCount(); index ++){
          if (racine.getChildren().get(index) instanceof UIComponent)
              SecurityFactory.getInstance().applySecurity(
              (UIComponent)racine.getChildren().get(index));
          }
        }
      }
     
      public void afterPhase(PhaseEvent event) {
        // les composants sont déjà affiché ici
      }
     
      public PhaseId getPhaseId() {
        return PhaseId.RENDER_RESPONSE;
      }
     
    }
    Le code n'a rien de sorcier. Le hic que je rencontre est que lorsque la méthode beforePhase est appelé, le UIViewRoot ne contient aucun enfants.

    De la même manière, la racine possède des composants fils lors de l'appel de la méthode afterPhase() mais comme les composants sont déjà affiché c'est trop tard. L'utilisateur peut toujours faire un F5 mais c'est moyen comme solution (vive la satisfaction client ).

    L'arborescence est crée entre les appels de méthodes beforePhase() et afterPhase() par le ViewHandler selon ce que j'ai compris. Est il possible de reprendre la main entre la création de l'arborescence et l'affichage de composants.

    J'ai lu d'autres sujets sur ce theme, mais très peu avec des réponses et aucun avec une solution viable (c'est à dire en gardant le même esprit de parcours de composants à la volée). Un petit coup de main serai le bienvenue.

    Merci et à +

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    511
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 511
    Par défaut
    Et si tu utilise le viewroot.findComponent ('id de ton composant'), tu ne peux pas recuperer tes composants ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 36
    Par défaut
    Non justement, les composants ne sont pas encore créé et mis dans le UIViewRoot. Les composants sont créé après, donc le UIViewRoot.findComponent(id) me renvoie null.

    Une solution trouvée : On écrit un composant à la main de haut niveau, qui n'est rien d'autre qu'un conteneur. Ce conteneur peut être soit entièrement écrit à la main soit juste une extension d'un conteneur de votre framework / librairie de composants favori. Ensuite faut juste passer la sécurité et l'internationalisation dans sa méthode encodeBegin ou encodeEnd. et Hop.

Discussions similaires

  1. jsf+ejb3+jboss+eclipse comment faire!
    Par amine_mte05 dans le forum JSF
    Réponses: 0
    Dernier message: 18/03/2010, 17h30
  2. Sécurité infromatique : Comment faire?
    Par ixialis dans le forum Sécurité
    Réponses: 1
    Dernier message: 03/05/2008, 03h09
  3. Réponses: 3
    Dernier message: 29/04/2008, 12h33
  4. Réponses: 11
    Dernier message: 20/02/2007, 10h16
  5. Enlever ma sécurité utilisateur... Comment faire?
    Par beletteroi dans le forum Sécurité
    Réponses: 1
    Dernier message: 06/12/2005, 23h33

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