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

Tomcat et TomEE Java Discussion :

[Tomcat7] Redirection URL conditionnelle selon adresse IP source (ou domaine)


Sujet :

Tomcat et TomEE Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2016
    Messages : 8
    Par défaut [Tomcat7] Redirection URL conditionnelle selon adresse IP source (ou domaine)
    Bonjour,

    Je suis en présence d'une appli web (JSP) d'un progiciel déployée sous "Tomcat 7.0.67".
    Cette appli peut être utilisée par des postes clients via le LAN (domaine MYDOMAIN.LOCAL) ou via un accès externe web (URL publique).

    Comment, en fonction de l'origine de la connexion, réseau interne/réseau externe, rediriger les postes clients respectivement vers une URL "I" ou URL "E" ?
    Peut-on détecter le nom de domaine interne auquel est rattaché un poste client en LAN ou doit-on identifier l'origine de la connexion (interne/externe) en analysant les 1ers chiffres de l'adresse IP du poste client ?

    J'ai très peu de connaissances en programmation web (JSP ou autre...), pouvez-vous SVP me fournir un exemple concret que j'adapterai ?

    Par avance, merci.

    @+

    Steve.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2016
    Messages : 8
    Par défaut Tomcat7: redirection URL conditionnelle selon adresse IP source (ou domaine)
    Ha, j'oubliais: JRE 8_66

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Si le but est de servir différemment led clients je ferais deux applications séparées avec un apache httpd en frontal avec des virtualhost différents sur chaque réseau où il est relié.

    Tu peux mettre du filtrage par ip source dans tomcat mais c'est vite du chipotage.

  4. #4
    Membre Expert
    Avatar de hasalex
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2009
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2009
    Messages : 879
    Par défaut
    Dans Tomcat, la notion de host sert à ça : http://tomcat.apache.org/tomcat-7.0-...nfig/host.html

    Mais c'est vrai que ce n'est pas très utilisé, et qu'on préfère utiliser Apache pour ça.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2016
    Messages : 8
    Par défaut
    Hello,

    La solution recherchée est certes un peu bricolée mais je dois faire avec le temps et les moyens dont je dispose...

    J'ai trouvé ces exemples sur le forum:

    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
    31
    32
    33
    En ASP:
    ------
    <%
    dim vlp
    ' On détecte l'IP
    vlp=Request.ServerVariables("REMOTE_ADDR")
     
    if left(vlp,6)<> "192.6." then
    ' Si l'adresse ne commence pas par 192.6.
    response.Redirect("erreur2.htm")
    end if
     
    %>
     
     
    En PHP
    ---
    <?php
     
    switch(substr($_SERVER['REMOTE_ADDR'],0,2))
    {
        case 10 :
            header('Location: adresse1.php');
        break;
     
        case 20 :
            header('Location: adresse2.php');
        break;
    }
    ?>
     
     
    10, 20, .... = début adresse
    Est-il possible de les adapter pour Tomcat 7 + JRE 8_66 ?

    Par avance, merci.

    @+

    Steve

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    si tu veux le faire en pur java, fait le dans un ServletFilter, ça te permettra de protéger toutes tes ressources en même temps. Mais bon filtrer sur ip source c'est un peu faible comme protection. Ca peux mentir une ip source. BRe, toutes les infos dont t'as besoin sont dans l'objet Request.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2016
    Messages : 8
    Par défaut
    Hello,

    Merci pour vos suggestions mais étant novice en la matière ça ne me parle pas beaucoup.
    Pouvez-vous SVP développer un peu vos réponses ?

    Sinon, je me suis mis à Java ce WE et ai "bricolé" la page JSP suivante, grâce à différents exemples trouvés sur ce forum notamment.
    Ne riez pas trop fort SVP... le patchwork n'est sûrement pas rès "joli".

    C'est syntaxiquement correct mais même quand je suis sur le réseau local, la redirection se fait toujours comme si j'étais sur le web.
    Pourtant quand je n'affichais que les 6 1ers caractères de l'adresse IP, je voyais bien "10.66." que j'ai mis dans ma condition.

    Pour préciser le besoin : si l'utilisateur se connecte à partir du LAN il doit être dirigé sur la page configurée en SSO (Kerberos, imposé par le progiciel. "vm-001" est le hostname) sinon il est dirigé vers une URL publique, évidemment sans SSO possible.
    La nécessité de jongler entre 2 URL est propre à IE11 et ses zones de sécurités (URL en "Intranet local" obligatoire pour le SSO mais alors injoignable en accès web). Le problème ne se pose pas sous Firefox(pas de notion de zone de sécurité).

    Merci de m'apporter toute remarque ou suggestion utiles.

    @+

    Steve.


    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <HTML>
      <HEAD>
        <TITLE>Test redirection selon adresse IP</TITLE>
      </HEAD>
     
      <BODY>
        <H1>IP detection</H1>
    <%   String ip = request.getHeader("X-Forwarded-For");  
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
                ip = request.getHeader("Proxy-Client-IP");  
            }  
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
                ip = request.getHeader("WL-Proxy-Client-IP");  
            }  
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
                ip = request.getHeader("HTTP_CLIENT_IP");  
            }  
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
                ip = request.getHeader("HTTP_X_FORWARDED_FOR");  
            }  
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {  
                ip = request.getRemoteAddr();  
            };
            out.print( ip+" - " );
    		out.print( ip.substring(0,6) );
    		if (ip.substring(0,6).equals("10.66."))
    		   {out.println(" => connected from LAN, SSO enabled");
               // New location to be redirected
               String site = new String("https://vm-001/X/Y/SSO.jsp");
               response.setStatus(response.SC_MOVED_PERMANENTLY);
               response.setHeader("Location", site); 
    		   }
    		else 
    		   {out.println(" => connected from WEB, SSO disabled");
    		   String site = new String("https://abc.societe.fr/X/Y/NoSSO.jsp");
               response.setStatus(response.SC_MOVED_PERMANENTLY);
               response.setHeader("Location", site);
               }
     
            %>
      </BODY>
    </HTML>

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Une ServletFilter est un bout de code que tu peux mettre autour d'un ou plusieurs servlet / jsp et qui fonctionne grosso modo comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){
       // code a exécuter avant la servlet
       chain.doFilter(request,response);
       // code à exécuter après
    }
    Dans ton cas ce serait un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class LanFilter implements javax.servlet.Filter
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){
       if (ipAuthorisee(request.getRemoteAddr()) {
          chain.doFilter(request,response);
       } else {
          request.getDispatcher("/pasBienResourAuSitePublic.jsp").forward(request,response);
       }
      }
     // autres méthodes de l'interface qui peuvent etre vides
    }
    Même genre de code pour le filtre n'autorisant que les extérieurs. Tu peux ensuite adapter en fonction de tes besoins.


    Il faut ensuite associer tes filtre à des servlet, soit par pattern de chemin, soit par nom de servlet. Une pattern permet de couvrir beacoup de servlets / jsp d'un coup.

    Dans le 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
     
    <web-app>
       <filter>
          <filter-name>MonFiltreLan</filter-name>
          <filter-class>LanFilter </filter-class>
       </filter>
       <filter>
          <filter-name>MonFiltrePublic</filter-name>
          <filter-class>PublicFilter </filter-class>
       </filter>
     
       <filter-mapping>
          <filter-name>MonFiltreLan</filter-name>
          <url-pattern>/lan/*</url-pattern>
       </filter-mapping> 
     
       <filter-mapping>
          <filter-name>MonFiltrePublic</filter-name>
          <url-pattern>/public/*</url-pattern>
       </filter-mapping>
    Ainsi, si tu code correctement test filtres, ce qui se trouve dans lan/ n'est accessible que depuis les ip lan et ce qui se trouve dans /public n'est accessible que depuis les ips publiques.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2016
    Messages : 8
    Par défaut
    Bonsoir Tchize,

    Merci pour ces explications plus détaillées.
    Je vois en gros le principe.

    Si je comprends bien, je dois écrire une fonction ipAuthorisee(...) à partir de mon bout de code bricolé donné dans mon post précédant.

    Avec cette méthode de détection d'adresse IP, il y a un petit risque de tomber sur une IP publique correspondant à une IP interne, non ?
    (surtout en cas de déplacement international de l'utilisateur)

    Y aurait-il une méthode plus fiable pour distinguer les utilisateurs connectés via le LAN ou via le web ?
    Récupération du nom du domaine réseau auquel est rattaché le poste client par exemple ?
    Ce qui reviendrait à accéder aux variables d'environnement Windows:
    USERDOMAIN et USERDOMAIN_ROAMINGPROFILE.
    Ca n'a pas l'air faisable facilement (non transmis dant le HTTP header ?).

    @+

    Steve

  10. #10
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Steve_92 Voir le message
    Avec cette méthode de détection d'adresse IP, il y a un petit risque de tomber sur une IP publique correspondant à une IP interne, non ?
    Par définition, un LAN est interne. Après, tout dépend de ta définition de LAN et de web, c'est à partir de ça que tu définira tes règles. C'est aussi pour ça en général qu'un passe par un virtual host apache, afin de pouvoir mettre le serveur accessible sur deux noms / ip serveur différents: un nom interne, accessible uniquement à l'entreprise, et un nom externe, accessible publiquement. Ensuite on laisse les sysadmin définir les règles de routage pour rendre accessible chaque serveur suivant qui y a droit.
    Citation Envoyé par Steve_92 Voir le message
    Récupération du nom du domaine réseau auquel est rattaché le poste client par exemple ?
    Ca reviens à le déterminer à partir de l'ip... Utiliser des variables venant du poste client, ça reviens à faire confiance au poste client et donc ça reviens à n'avoir aucune sécurité.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2016
    Messages : 8
    Par défaut Test JSP OK
    Hello,

    Je parlerai du "virtual host Apache", solution certes très "pro", au collègue multi-casquettes (admin.réseau+web dev.) à son retour de congés dans 10 jours mais je crains qu'il n'ait pas trop de temps à y consacrer (toute petite équipe info. débordée).

    J'ai testé mon bout de code (post #7) en condition réelle sur un PC portable, il marche nickel (accès via LAN+accès web en 4G).

    C'est un bricolage temporaire qui doit durer quelques mois en attendant la mise en place d'un VPN.

    En terme de sécurité, ce bout de code tient-il la route (réseau bien sûr ) ?

    @+

    Steve.

  12. #12
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Non, il ne fournis aucune sécurité, il ne fait que faire une redirection vers une autre page. Il se passe quoi si je tappe https://abc.societe.fr/X/Y/SSO.jsp depuis le web? Il faut du code dans ta page SSO.jsp qui l'empeche de s'exécuter depuis le web.

    La sécurité c'est interdire aux gens de faire ce qu'ils ne peuvent pas faire. La politesse, c'est de les amener automatiquement là où ils sont supposé aller. Tu ne fais que le deuxième.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2016
    Messages : 8
    Par défaut Page d'authentification
    Hello Tchize,

    Merci de t'intéresser à mon problème et à sa solution "bricolée" hâtivement...

    Si je tape https://abc.societe.fr/X/Y/SSO.jsp :

    -sous "IE 11": en connexion externe (web), je me prends une fenêtre "Sécurité de Windows" qui demande un user/password, en cliquant sur [ annuler ], j'arrive sur la page d'authentification du portail du progiciel qui me demande un user/password

    -sous "Firefox 44": j'arrive directement sur la page d'authentification du portail du progiciel

    Le portail me semble correctement protégé à condition, bien sûr, d'utiliser des mots de passe suffisamment complexes pour éviter les attaques "brute force".

    @+

    Steve

  14. #14
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Du coup je ne comprends pas pourquoi du coup tu veux un filtrage puisqu'au final tu te base sur les mots de passe pour déterminer qui peux faire quoi. Bref, j'en reste sur ce que j'ai dit, en terme de sécurité, le bout de code que t'as mis n'a aucune sécurité.

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mars 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mars 2016
    Messages : 8
    Par défaut Ergonomie
    Hello,

    En fait cette page a plutôt un rôle ergonomique.
    Elle redirige automatiquement l'utilisateur vers la page sécurisée la plus adaptée à son mode de connexion:

    - connexion à partir du LAN => page dotée du SSO (donc accès direct au portail sans passer par la page de login du progiciel)
    - connexion à partir du web => page de login du progiciel (pas de SSO possible car pas d'accès au serveur de tickets Kerberos)

    Ceci gère, sans toucher à l'architecture, le problème qui se pose pour les PC portables qui se connectent via IE11 tantôt à partir du LAN, tantôt à partir du web.
    Sous IE11, pour que le SSO fonctionne, l'URL https://abc.societe.fr, racine de https://abc.societe.fr/X/Y/SSO.jsp doit être placée dans le zone de sécurité "Intranet local".

    Si cette URL https://abc.societe.fr/X/Y/SSO.jsp est utilisée à partir d'un PC connecté via le web => erreur "Cette page ne peut s'afficher".
    Pour que l'URL fonctionne, il faut la supprimer de la zone "Intranet local".

    Par contre, aucun problème sous "Firefox 44" qui n'utilise pas la concept de "zones de sécurité" comme IE.

    Voilà, j'espère que c'est un peu plus clair.

    @+

    Steve.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/12/2010, 08h28
  2. Redirection selon adresse IP du serveur
    Par trifly dans le forum Langage
    Réponses: 2
    Dernier message: 29/07/2010, 15h47
  3. Réponses: 3
    Dernier message: 07/07/2010, 14h30
  4. Redirection URL Non visible dans la barre d'adresse
    Par domileg dans le forum Langage
    Réponses: 5
    Dernier message: 04/08/2006, 09h02

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