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

BIRT Discussion :

[2.2.2] Gestion de profils dans Birt Viewer


Sujet :

BIRT

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut [2.2.2] Gestion de profils dans Birt Viewer
    Bonjour,

    Je dois créer un ensemble de rapports consultables de manière hiérarchique dans le Birt Viewer.
    L'aspect hiérarchique se base sur la présence d'icônes associées à un lien hypertexte menant vers le rapport suivant.
    Ces rapports ne doivent être consultables que pour des utilisateurs possédant le profil idoine.
    Pour cela, j'ai mis en place dans le web.xml du Birt Viewer les éléments nécessaires à une gestion de profils.

    Du côté de mes rapports, j'ai codé dans le script "initialize" du rapport de plus haut niveau de ma hiérarchie le code suivant :
    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
     
    function checkAccessRights(userProfile) {
     
    	importPackage(Packages.javax.servlet.http);
    	importPackage(Packages.java.security);
    	importPackage(Packages.java.lang);
     
     
    	servletRequest = reportContext.getHttpServletRequest();
     
    	var userPrincipal = servletRequest.getUserPrincipal();
    		if (servletRequest.isUserInRole(userProfile) == false) {
    		return "'http://localhost:8080/birt/frameset?__report=Indicateurs/Indicateurs generaux/erreur.rptdesign'"
    	}
    	else {
    		return null;
    	}
    }
    reportContext.setPersistentGlobalVariable("checkAccessRights", checkAccessRights);
    et sur chacun de mes boutons, amenant vers un rapport "protégé", j'ai codé le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Définition du profil nécessaire à la consultation de ce rapport
    var profile =  "BIRT_ADMIN";
    var url = checkAccessRights(profile);
    if (url != null) {
    	this.getAction().URI = url;
    }
    Le principe est donc le suivant : lorsque un utilisateur clique sur un bouton, son rôle, tel que défini dans le serveur tomcat, est vérifié et si le rôle est non conforme au rôle requis, alors c'est un rapport d'erreur qui est affiché.

    Cela marche bien, mais mon problème est le suivant :
    Si au lieu de suivre la navigation dans les rapports un utilisateur tape directement l'url d'un rapport dans la barre d'adresse du navigateur, alors il accède au rapport sans problème.

    Alors, il faudrait mettre en place sur le script "initialize" de l'un quelconque des sous-rapports un mécanisme du genre :
    Si l'utilisateur n'a pas les droits requis, alors on lance le rapport d'erreur et la tâche en cours se saborde.
    Je n'ai pas trouvé de moyen pour stopper un rapport dans son script "initialize", et pour la "redirection" vers le rapport d'erreur, j'ai essayé les choses suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    importPackage(Packages.java.lang);
    System.out.println("In Initialize ...");
     
    importPackage(Packages.org.eclipse.birt.report.engine.api);
    var erreur = reportContext.getReportRunnable().getReportEngine().openReportDesign("erreur.rptdesign");
    var task = reportContext.getReportRunnable().getReportEngine().createRunAndRenderTask(erreur);
     
    var render = new HTMLRenderOption()
    render.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);
    task.renderOption = render;
    task.run();
    mais cela ne marche pas ...

    Quelqu'un aurait il déjà mis en oeuvre ce genre de manip, ou aurait une idée ou un avis ?

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Pas de réponse ...

    Personne n'a d'idée ???

    Merci ...

  3. #3
    Membre éprouvé
    Avatar de lazarel
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2007
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mai 2007
    Messages : 893
    Points : 1 164
    Points
    1 164
    Par défaut
    Bonjour,

    Si tu as une application web tu dois surement avoir des variable de sessions associées à tes utilisateurs. Tu peux être utiliser ça dans ta servlet pour bloquer les accès aux documents...

    Cordialement Lazarel

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Non, comme je l'explique, mon appli web EST le Birt-Viewer et j'y ai intégré les contraintes de sécurité via son fichier web.xml.
    La gestion de profils est alors opérationnelle si l'on suit la navigation via les liens hypertexte (ou les boutons) de mes différents rapports.
    Cependant, il m'est impossible de masquer la barre d'adresse du navigateur et si un utilisateur saisit directement l'url du rapport dans la barre d'adresse, alors la protection mise en place est outrepassée.

    Mon problème alors est le suivant : existe t'il un moyen dans un rapport (dans une des entrées de script "initialize", "beforeFactory", "afterFactory", "beforeRender" ou "afterRender") de "tuer" mon rapport en cours de production ?

    Merci de vos réponses.
    Cordialement

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 132
    Points : 68
    Points
    68
    Par défaut
    Salut a tous,

    Je fais remonter ce POST car j'ai le même problème que Marco.
    Je veux mettre en place une sécurité, de telle sorte que si un utilisateur appelle un rapport avec le viewer directement dans la barre d'adresse, on vérifie si celui-ci est authentifié.

    Merci

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 229
    Points : 137
    Points
    137
    Par défaut
    Bonjour,

    Pour l'un de nos développements nous avons du protéger certains répertoires en utilisant les fonctionnalités de tomcat, web.xml, et fichiers des users tomcat.
    Nous avons en plus modifié le mode d'appel des rapports en pratiquant un "post" de formulaire dans le fichier index.jsp.
    Ce n'est plus un href qui est passé pour lancer l'éxécution des rapports mais un bouton sur lequel nous avons codé sur l'évènement onclick une méthode passant un argument au rapport (argument placé en hidden sur le rptdesign). Cela a pour effet de masquer à l'utilisateur l'url complète passée.
    Bien evidemment un utilisateur averti saura via le code source de la page reconstruire cette url, néanmoins cela permet déjà de placer un petit niveau de sécurtié.

    Placer ceci en début d'index.jsp
    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
     
    <SCRIPT LANGUAGE="Javascript1.1">
    /**
     *  créer un formulaire a la volée et le soumettre en POST.
     *  exemple : submitForm2('/action.do',{param1:23, param2:true, param3:'exemple'}); 
     */
    function submitForm2(action, params)
    {
        f = document.createElement('form');
        f.setAttribute('method','post');
        f.setAttribute('action', action);
        f.setAttribute('target', '_blank');
        if(params)
        {
            for(p in params)
            {
                e = document.createElement('input');
                e.setAttribute('name', p);
                e.setAttribute('type', 'hidden');
                e.value=''+params[p];
                f.appendChild(e);
            }
        }
        document.body.appendChild(f);
        f.submit();
    }
    </SCRIPT>
    Appel du rapport
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    out.println(<button style=\"border: none; background: none; cursor: pointer; align: left\" type=\"button\" onclick=\"submitForm2('request.getContextPath( )/run?__report=client/rapports/monrapport.rptdesign&__format=pdf&__parameterpage=true',{Selection_Client:'MONCLIENT'})><span style=\"text-decoration: underline; color: blue;\">Mon Rapport</span></button>
    j'espère que cela répond à ton besoin

  7. #7
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 132
    Points : 68
    Points
    68
    Par défaut
    Effectivement cette solution correspond a mon problème mais ce n'est pas la plus sécurisé.
    Je pensais plutôt a une méthode (Servlet, Listeners ou Autres) qui permette d'intercepter l'appel sur la servlet ViewerServlet via l'url pattern /frameset ou /run, et qui vérifie si le user est bien authentifié.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    229
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 229
    Points : 137
    Points
    137
    Par défaut
    j'en conviens.

    L'url est désormais partielle (en visu pour l'utilisateur) donc l'utilisateur ne peut plus l'utiliser directement dans son navigateur.

    Bon courage dans tes recherches.

  9. #9
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 132
    Points : 68
    Points
    68
    Par défaut
    Citation Envoyé par scariou29 Voir le message
    j'en conviens.

    L'url est désormais partielle (en visu pour l'utilisateur) donc l'utilisateur ne peut plus l'utiliser directement dans son navigateur.

    Bon courage dans tes recherches.
    Oui mais l'URL reste visible dans le code source, que se soit dans le javascript ou HTML. Je préfère une méthode plus générique, t-elle une servlet qui intercepte l'appel de BIRT (Frameset ou Run).
    Je n'ai pas eu le temps de chercher une méthode, mais dès que je trouve je vous fais signe.
    Merci

  10. #10
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    132
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 132
    Points : 68
    Points
    68
    Par défaut
    Salut,
    Bon j'ai trouvé une solution.
    J'ai utilisé un filtre.
    Voici la méthode doFilter de mon filtre
    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
    	public void doFilter(ServletRequest request, ServletResponse response,FilterChain arg2) throws IOException, ServletException {
     
    		//URI correspond
    		HttpServletRequest httpRequest = (HttpServletRequest)request;
     
    		if(verifAuthentification(request)) {
    			arg2.doFilter(request, response);
    		} else {
    //Reconstitution de l'url avec les paramètres			
    String paramURL = ToolboxServlet.parametreRequete(httpRequest);
    			String url = "/index.jsp?page="+ httpRequest.getRequestURI()+paramURL;
    			if (this.debug) {
    				System.out.println("Param URL : "+paramURL);
    				System.out.println("URL : " +url);
    			}
    			request.getRequestDispatcher(url).forward(request, response);
    		}
    	}
    Ensuite j'ai configuré le fichier web.xml
    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
    	<filter>
    		<filter-name>AuthentificationBirt</filter-name>
    		<filter-class>filter.AuthentificationBirt</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>AuthentificationBirt</filter-name>
    		<servlet-name>ViewerServlet</servlet-name>
    	</filter-mapping>
     	<filter-mapping>
    		<filter-name>AuthentificationBirt</filter-name>
    		<servlet-name>EngineServlet</servlet-name>
    	</filter-mapping>
     
    	<filter>
    		<filter-name>ViewerFilter</filter-name>
    		<filter-class>org.eclipse.birt.report.filter.ViewerFilter</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>ViewerFilter</filter-name>
    		<servlet-name>ViewerServlet</servlet-name>
    	</filter-mapping>
    	<filter-mapping>
    		<filter-name>ViewerFilter</filter-name>
    		<servlet-name>EngineServlet</servlet-name>
    	</filter-mapping>
    Mon filtre regarde si les servlets ViewerFilter et EngineServlet sont appelées.
    Du coup dans mon filtre AuthentificationBirt je peux vérifier si l'utilisateur est authentifié. Si il n'est pas authentifié, je le redirige vers vers la page de login.

    Je sais pas si j'ai été très clair.
    N'hésitez pas a demander plus de renseignements.

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/10/2011, 10h30
  2. Réponses: 3
    Dernier message: 17/11/2009, 09h36
  3. Fonction non reconnue dans birt viewer
    Par jsatriani dans le forum BIRT
    Réponses: 1
    Dernier message: 03/12/2008, 10h36
  4. [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
  5. C'est quoi "Profile" dans le assign du XMLGram ?
    Par Lux interior dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/02/2003, 11h37

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