Forum Programmation.web Tomcat7: redirection URL conditionnelle selon adresse IP source (ou domaine)

Posté par . Licence CC by-sa
Tags : aucun
1
12
mar.
2016

Bonjour,

Je suis en présence d'une appli web (JSP) d'un progiciel déployée sous "Tomcat 7.0.67"+JRE 8_66.
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.

  • # un site, une appli

    Posté par . Évalué à 2.

    que les gens viennent de A ou de B, quand tu accedes au serveur via son IP tu tombe sur UN site.

    si tu veux renvoyer les utilisateurs selon A ou B, tu peux utiliser les fonctionnalités de base pour ton service reseau : le DNS
    les utilisateurs internes vont demander intranet.mydomain.local
    les visiteurs externes vont demander www.tasociété.com

    à partir de là ton serveur recoit les demandes, et doit pouvoir rediriger les utilisateurs qui demandent intranet.mydomain.local vers un site ou un URL
    et ceux qui demande www.tasociété.com vers un autre site (sur le meme serveur) ou sur une URL

    Apache fait ca, c'est la fonctionnalité virtualhost
    Tomcat doit pouvoir le faire aussi.

  • # Pour préciser le besoin...

    Posté par . Évalué à 1.

    Hello,

    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) 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é).

    Selon toi, tout pourrait se gérer au niveau DNS ?

    Steve

  • # reForum Programmation.web Tomcat7:redirection URL conditionnelle selon adresse IP source (ou domain)

    Posté par . Évalué à -2.

    Bonjour,
    Toutes les solutions te sont proposés dans tous les commentaires qui sont postés en réponse à ton sujet. Toutefois, il faut aussi que tu saches qu'il est possible que la personne utilise un VPN. Le VPN peut lui servir de masquer sa réelle adresse IP. Mais il y a toujours une possibilité de démasquer l'adresse réelle. Il y a toujours une piste pour tracer le site sans avoir à pirater le serveur de son hébergeur web ou autres. Il te faut juste la bonne démarche.

    • [^] # Tomcat7:redirection URL conditionnelle selon adresse IP source (ou domain)

      Posté par . Évalué à 0. Dernière modification le 15/03/16 à 21:21.

      Hello,

      Je me suis finalement mis à Java le WE dernier et ai pondu cette page JSP, placée sous Tomcat7/webapps/ROOT:

      <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();  
              };
      
              if (ip.substring(0,6).equals("10.66."))
                 {out.println(" => connected from LAN, SSO enabled");
                 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>

      Je l'ai testée en condition réelle à partir d'un PC portable, elle marche nickel (accès via LAN ou web en 4G).

      Cette solution "bricolée" doit tenir quelques mois en attendant la mis en place d'un VPN.

      Des remarques sur ce bout de code en matière de sécurité ?
      (balise code HS!)

      Merci.

      @+

      Steve.

      • [^] # Re: Tomcat7:redirection URL conditionnelle selon adresse IP source (ou domain)

        Posté par (page perso) . Évalué à 3.

        (balise code HS!)

        bah, non, mais ça se fait comme indiqué sur https://linuxfr.org/wiki/aide-edition#code qui est rappelé dans l'aide mémoire au bas de chaque commentaire que tu rédiges ; avant de le valider, il est même possible de prévisualiser (et relire l'aide mémoire au besoin).

        Test redirection selon adresse IP
        
        IP detection
        <% 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");
        
        }

        Je laisse un modo corriger le code de ton commentaire ;-) (et enlever le bout que j'ai placé dans le mien à titre d'exemple)

  • # Le code

    Posté par . Évalué à 1.

    Hello,

    En fait c'est le bouton [<> ] qui ne marche pas bien : quand je clique dessus, je ne vois pas la balise "triple apostrophe inversé" mais 3 espaces.

    En tapant à la main, ça va mieux.
    Voici le code:

    <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>

    Rien qui ne pique les yeux ?
    Des remarques ou suggestions ?
    Pas de faille de sécurité ?

    @+

    Steve.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.