Developpement:Architecture web

De Wiki1000
(Différences entre les versions)
Ligne 1 : Ligne 1 :
==Architectures multi services==
+
 
 +
 
 +
 
 +
 
 +
'''Amélioration de l’a''''''rchitecture'''''' ''''''Web''''''.'''
 +
 
 +
 
 +
{| class="wikitable"
 +
|-
 +
|'''Version'''
 +
|'''Date'''
 +
|'''Motif'''
 +
|'''Parties modifiées'''
 +
|-
 +
|1.0
 +
|
 +
|Création
 +
|
 +
|-
 +
|1.1
 +
|
 +
|
 +
|Modèle d’écran
 +
|-
 +
|
 +
|
 +
|
 +
|
 +
|-
 +
|
 +
|
 +
|
 +
|
 +
|-
 +
|
 +
|
 +
|
 +
|
 +
|-
 +
|
 +
|
 +
|
 +
|
 +
|-
 +
|
 +
|
 +
|
 +
|
 +
|}
 +
 
 +
 
 +
 
 +
'''Sommaire'''''' :'''
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
==''Architectures multi services''==
 +
 
 +
 
  
 
===Objectifs===
 
===Objectifs===
  
 
L’architecture multi services à pour but d’améliorer la disponibilité des applications métier et de permettre leur monté en charge en terme d’utilisateur connectés.
 
L’architecture multi services à pour but d’améliorer la disponibilité des applications métier et de permettre leur monté en charge en terme d’utilisateur connectés.
 +
 +
  
 
Cet objectif est réalisé en permettant la redondance des principaux composants de l’architecture technique :
 
Cet objectif est réalisé en permettant la redondance des principaux composants de l’architecture technique :
Ligne 10 : Ligne 90 :
  
 
Les serveurs d’application Ligne 1000
 
Les serveurs d’application Ligne 1000
 +
 +
  
 
La charge d’une application métiers WEB, accessible  par une URL, peut ainsi être répartie sur plusieurs services Ligne 1000.
 
La charge d’une application métiers WEB, accessible  par une URL, peut ainsi être répartie sur plusieurs services Ligne 1000.
 +
 +
  
 
Toutefois le but de ce système n’est pas d’apporter une résistance aux pannes au niveau de la session d’un utilisateur ; en cas de panne d’un serveur  d’application appartenant à un cluster de serveurs les sessions de celui-ci sont perdues.
 
Toutefois le but de ce système n’est pas d’apporter une résistance aux pannes au niveau de la session d’un utilisateur ; en cas de panne d’un serveur  d’application appartenant à un cluster de serveurs les sessions de celui-ci sont perdues.
 +
 +
  
 
===Répartition de la charge===
 
===Répartition de la charge===
Ligne 22 : Ligne 108 :
  
 
Chaque Service se voit attribué un nom unique.
 
Chaque Service se voit attribué un nom unique.
 +
 +
  
 
Les identifiants de session (SID) sont tirés par les Services et constitués d’un numéro unique concaténé au nom du Service. Cette application garantie que les SID seront unique pour l’ensemble d’une configuration.
 
Les identifiants de session (SID) sont tirés par les Services et constitués d’un numéro unique concaténé au nom du Service. Cette application garantie que les SID seront unique pour l’ensemble d’une configuration.
 +
 +
  
 
Lors de la connexion d’un nouvel utilisateur le client HTTP interroge chaque serveur pour connaître leur charge actuelle et identifier le meilleur choix.
 
Lors de la connexion d’un nouvel utilisateur le client HTTP interroge chaque serveur pour connaître leur charge actuelle et identifier le meilleur choix.
 +
 +
  
 
Lors de la réception d’une requête le client HTTP utilise le SID (transmis dans chaque requête) pour identifier le Serveur 1000 sur lequel router la requête.
 
Lors de la réception d’une requête le client HTTP utilise le SID (transmis dans chaque requête) pour identifier le Serveur 1000 sur lequel router la requête.
 +
 +
  
 
Cet algorithme évite de  maintenir des tables SID – Services.
 
Cet algorithme évite de  maintenir des tables SID – Services.
 +
 +
  
 
Une connexion cliente :  
 
Une connexion cliente :  
Ligne 36 : Ligne 132 :
  
 
Peut utiliser différent serveurs HTTP.  
 
Peut utiliser différent serveurs HTTP.  
 +
 +
  
 
La configuration des Client HTTP doit énumérer tous les Serveurs 1000 ; pour cela les fichiers de configurations sont modifiés ainsi :
 
La configuration des Client HTTP doit énumérer tous les Serveurs 1000 ; pour cela les fichiers de configurations sont modifiés ainsi :
  
<nowiki>
+
 
[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\GCF]
+
 
serverList=GCF1,GCF2
+
[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\GCF]
+
 
[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\GCF1]
+
serverList=GCF1,GCF2
ipcMode=ipcTCP
+
 
shmAddress=hostGCF1
+
 
+
 
[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\GCF2]
+
[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\GCF1]
ipcMode=ipcTCP
+
 
shmAddress=hostGCF2
+
ipcMode=ipcTCP
</nowiki>
+
 
 +
shmAddress=hostGCF1
 +
 
 +
 
 +
 
 +
[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\GCF2]
 +
 
 +
ipcMode=ipcTCP
 +
 
 +
shmAddress=hostGCF2
  
 
===Diagramme de déploiement===
 
===Diagramme de déploiement===
  
==Sécurité des accès WEB==
+
 
 +
 
 +
 
 +
 
 +
=='''Sécurité des accès WEB'''==
 +
 
 +
 
  
 
===Utilisation de HTTPs===
 
===Utilisation de HTTPs===
Ligne 73 : Ligne 186 :
  
 
Lors de la création de la session stocker l’adresse IP du client et vérifier à chaque requête que le client est bien celui qui à créée la session.  
 
Lors de la création de la session stocker l’adresse IP du client et vérifier à chaque requête que le client est bien celui qui à créée la session.  
 +
 +
  
 
==Utilisation d’écran Ligne 1000 dans des applications WEB tiers.==
 
==Utilisation d’écran Ligne 1000 dans des applications WEB tiers.==
Ligne 82 : Ligne 197 :
 
Inclure le fichier JavaScript « l1000env.js » dans votre page. Ce script permet de charger l’ensemble des éléments nécessaires pour manipuler les fenêtres ligne 1000. Il est situé dans le répertoire du site Ligne 1000.
 
Inclure le fichier JavaScript « l1000env.js » dans votre page. Ce script permet de charger l’ensemble des éléments nécessaires pour manipuler les fenêtres ligne 1000. Il est situé dans le répertoire du site Ligne 1000.
  
<nowiki>
+
<script type="text/javascript" src="../js/l1000env.js"></script>
<script type="text/javascript" src="../js/l1000env.js"></script>
+
 
</nowiki>
+
 
  
 
Définir une variable JavaScript pointant sur le chemin relatif de l’application ligne 1000 utilisée.
 
Définir une variable JavaScript pointant sur le chemin relatif de l’application ligne 1000 utilisée.
Ligne 90 : Ligne 205 :
 
Par exemple si vous souhaitez ouvrir un écran de l’application gcf :   
 
Par exemple si vous souhaitez ouvrir un écran de l’application gcf :   
  
<nowiki>
+
 
var l1000Root="/gcf";
+
 
</nowiki>
+
var l1000Root="/gcf";
 +
 
 +
 
  
 
Ouvrez la fenêtre à l’aide de la fonction JavaScript  
 
Ouvrez la fenêtre à l’aide de la fonction JavaScript  
  
<nowiki>
+
checkEnvL1000(callFormAlias,null,["",form_name, form_args, session_id, society_name, user_name, user_password]);
checkEnvL1000(callFormAlias,null,["",form_name, form_args, session_id, society_name, user_name, user_password]);
+
 
</nowiki>
+
 
  
 
Il existe trois méthodes pour gérer l’authentification ligne 1000 :
 
Il existe trois méthodes pour gérer l’authentification ligne 1000 :
Ligne 108 : Ligne 225 :
 
Si vous utilisez cette méthode passer une chaine vide pour l’identifiant de session :  
 
Si vous utilisez cette méthode passer une chaine vide pour l’identifiant de session :  
  
<nowiki>
+
checkEnvL1000(callFormAlias,null,["",form_name, form_args, "", society_name, user_name, user_password]);
checkEnvL1000(callFormAlias,null,["",form_name, form_args, "", society_name, user_name, user_password]);
+
</nowiki>
+
  
 
====Fournir  un identifiant de session. ====
 
====Fournir  un identifiant de session. ====
Ligne 118 : Ligne 233 :
 
Pour obtenir un identifiant de session exécutez une requête sur le service de session du Serveur Ligne 1000 :  
 
Pour obtenir un identifiant de session exécutez une requête sur le service de session du Serveur Ligne 1000 :  
  
<nowiki>
+
http://hostname/application/server/signin.l1000?DB=society_name&USER= ser_name&PASSWORD= user_password&RESSID=1
http://hostname/application/server/signin.l1000?DB=society_name&USER=ser_name&PASSWORD=user_password&RESSID=1
+
 
</nowiki>
+
 
  
 
La réponse de serveur est de type text/plain et contient un identifiant de session. Cette opération doit être effectuée sur le serveur.
 
La réponse de serveur est de type text/plain et contient un identifiant de session. Cette opération doit être effectuée sur le serveur.
Ligne 126 : Ligne 241 :
 
Exemple d’appel à partir d’ASP.NET :  
 
Exemple d’appel à partir d’ASP.NET :  
  
<nowiki>
+
const string querystring = "DB={0}&USERNAME={1}&PASSWORD={2}&RESSID=1";
const string querystring = "DB={0}&USERNAME={1}&PASSWORD={2}&RESSID=1";
+
 
+
string query = string.Format(querystring, "5.0.2 - Test - Conso Groupe", "ereport", "8BC38A379D21F5F9A1B4145BDF663835");
string query = string.Format(querystring, "5.0.2 - Test - Conso Groupe", "ereport", "8BC38A379D21F5F9A1B4145BDF663835");
+
 
+
string L1000SID="";
string L1000SID="";
+
 
+
query = "http://ereport/conso1000/server/signin.l1000?" + query;
query = "http://ereport/conso1000/server/signin.l1000?" + query;
+
 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(query);
+
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(query);
request.AllowAutoRedirect = false;
+
 
try
+
request.AllowAutoRedirect = false;
{
+
 
 +
try
 +
 
 +
{
 +
 
 
     HttpWebResponse wresponse = (HttpWebResponse)request.GetResponse();
 
     HttpWebResponse wresponse = (HttpWebResponse)request.GetResponse();
 +
 
     StreamReader loResponseStream = new StreamReader(wresponse.GetResponseStream(), Encoding.ASCII);
 
     StreamReader loResponseStream = new StreamReader(wresponse.GetResponseStream(), Encoding.ASCII);
 +
 
     L1000SID = loResponseStream.ReadToEnd();
 
     L1000SID = loResponseStream.ReadToEnd();
} catch
+
 
{
+
} catch
  L1000SID = "";
+
 
}
+
{
Console.WriteLine(L1000SID);
+
 
</nowiki>
+
    L1000SID = "";
 +
 
 +
}
 +
 
 +
Console.WriteLine(L1000SID);
  
 
====Ne pas fournir d’informations d’identification. ====
 
====Ne pas fournir d’informations d’identification. ====
  
 
Dans ce cas l’appel à la fonction d’ouverture de l’écran va afficher une boite de dialogues pour que l’utilisateur saisisse les informations de connexion. Ces informations seront conservées d’une ouverture d’écran à l’autre.
 
Dans ce cas l’appel à la fonction d’ouverture de l’écran va afficher une boite de dialogues pour que l’utilisateur saisisse les informations de connexion. Ces informations seront conservées d’une ouverture d’écran à l’autre.
 +
 +
  
 
====Exemple complet en passant les paramètres d’authentification dans l’appel de l’écran====
 
====Exemple complet en passant les paramètres d’authentification dans l’appel de l’écran====
  
<nowiki>
+
<html>
<html>
+
 
<head>
+
<head>
<title>test open L1000 window</title>
+
 
<script type="text/javascript" src="../js/l1000env.js"></script>
+
<title>test open L1000 window</title>
<script>
+
 
var l1000Root="/gcf";
+
<script type="text/javascript" src="../js/l1000env.js"></script>
+
 
function Comptes() {
+
<script>
checkEnvL1000(callFormAlias,null,["","ecompta_comptesgeneraux.dfm","ArgPeriode=2006-12-31&ArgGroupeCompte=4000& ArgTypeFlux=F300","", "5.5.0 - Sage 1000 Entreprise - Projet", "crnit", "7B60A52ECC8DB633D57B05BCA36207ED"]);
+
 
 +
var l1000Root="/gcf";
 +
 
 +
function Comptes() {
 +
 
 +
checkEnvL1000(callFormAlias,null,["","ecompta_comptesgeneraux.dfm","ArgPeriode=2006-12-31&ArgGroupeCompte=4000&ArgTypeFlux=F300","", "5.5.0 - Sage 1000 Entreprise - Projet", "crnit", "7B60A52ECC8DB633D57B05BCA36207ED"]);
 +
 
 
}
 
}
</script>
+
 
+
</script>
</head>
+
 
<body>
+
</head>
<p>
+
 
Test open form
+
<body>
</p>
+
 
<a onclick=" Comptes();" href="#"> Comptes </a>
+
<p>
</body>
+
 
</html>
+
Test open form
</nowiki>
+
 
 +
</p>
 +
 
 +
<a onclick=" Comptes();" href="#"> Comptes </a>
 +
 
 +
</body>
 +
 
 +
</html>
  
  
 
[[Category:WebTop]]
 
[[Category:WebTop]]

Version du 20 mai 2008 à 17:05



Amélioration de l’a'rchitecture' 'Web'.


Version Date Motif Parties modifiées
1.0 Création
1.1 Modèle d’écran


'Sommaire' :












Sommaire

Architectures multi services

Objectifs

L’architecture multi services à pour but d’améliorer la disponibilité des applications métier et de permettre leur monté en charge en terme d’utilisateur connectés.


Cet objectif est réalisé en permettant la redondance des principaux composants de l’architecture technique :

Les serveurs HTTP

Les serveurs d’application Ligne 1000


La charge d’une application métiers WEB, accessible par une URL, peut ainsi être répartie sur plusieurs services Ligne 1000.


Toutefois le but de ce système n’est pas d’apporter une résistance aux pannes au niveau de la session d’un utilisateur ; en cas de panne d’un serveur d’application appartenant à un cluster de serveurs les sessions de celui-ci sont perdues.


Répartition de la charge

Ce paragraphe décrit comment fonctionne l’allocation des sessions.

L’algorithme est mis en œuvre au niveau du client HTTP lors de l’établissement de la session.

Chaque Service se voit attribué un nom unique.


Les identifiants de session (SID) sont tirés par les Services et constitués d’un numéro unique concaténé au nom du Service. Cette application garantie que les SID seront unique pour l’ensemble d’une configuration.


Lors de la connexion d’un nouvel utilisateur le client HTTP interroge chaque serveur pour connaître leur charge actuelle et identifier le meilleur choix.


Lors de la réception d’une requête le client HTTP utilise le SID (transmis dans chaque requête) pour identifier le Serveur 1000 sur lequel router la requête.


Cet algorithme évite de maintenir des tables SID – Services.


Une connexion cliente :

Utilisera toujours le même Service 1000

Peut utiliser différent serveurs HTTP.


La configuration des Client HTTP doit énumérer tous les Serveurs 1000 ; pour cela les fichiers de configurations sont modifiés ainsi :


[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\GCF]

serverList=GCF1,GCF2


[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\GCF1]

ipcMode=ipcTCP

shmAddress=hostGCF1


[\SOFTWARE\Sage\Ligne 1000\Administration\IPC\GCF2]

ipcMode=ipcTCP

shmAddress=hostGCF2

Diagramme de déploiement

Sécurité des accès WEB

Utilisation de HTTPs

Mécanisme standard. Les données échangées entre navigateur et serveur sont cryptées.

Testé sur Apache.

Association de l’adresse IP au SID de session.

Lorsqu’un utilisateur se connecte une session serveur est créée. L’identifiant de session est le seul paramètre visible par l’utilisateur dans les URL utilisées par l’application WEB.

Attaque possible :

Deviner des valeurs de SID valident et usurper l’identité d’un autre l’utilisateur.

Défense :

Lors de la création de la session stocker l’adresse IP du client et vérifier à chaque requête que le client est bien celui qui à créée la session.


Utilisation d’écran Ligne 1000 dans des applications WEB tiers.

La ligne 1000 offre un mécanisme permettant à une application WEB d’ouvrir un écran ligne 1000 dans une session utilisateur.

Voici les étapes à suivre :

Inclure le fichier JavaScript « l1000env.js » dans votre page. Ce script permet de charger l’ensemble des éléments nécessaires pour manipuler les fenêtres ligne 1000. Il est situé dans le répertoire du site Ligne 1000.

<script type="text/javascript" src="../js/l1000env.js"></script>


Définir une variable JavaScript pointant sur le chemin relatif de l’application ligne 1000 utilisée.

Par exemple si vous souhaitez ouvrir un écran de l’application gcf :


var l1000Root="/gcf";


Ouvrez la fenêtre à l’aide de la fonction JavaScript

checkEnvL1000(callFormAlias,null,["",form_name, form_args, session_id, society_name, user_name, user_password]);


Il existe trois méthodes pour gérer l’authentification ligne 1000 :

Fournir les informations société, utilisateur et mot de passe directement dans les paramètres d’appel de CheckEnvL1000.

Le principal désavantage de cette méthode est que le mot de passe est visible en clair dans la page, l’utilisateur peut en prendre connaissance et l’utiliser pour accéder à l’ensemble de l’application Ligne 1000.

Si vous utilisez cette méthode passer une chaine vide pour l’identifiant de session :

checkEnvL1000(callFormAlias,null,["",form_name, form_args, "", society_name, user_name, user_password]);

Fournir un identifiant de session.

Cette méthode permet de garantir une meilleure sécurité car l’utilisateur n’a pas connaissance des informations de connexion ; toutefois elle requière que l’application WEB soit capable d’obtenir un identifiant de session auprès du serveur Ligne 1000 et cette phase d’authentification doit être réalisée coté serveur.

Pour obtenir un identifiant de session exécutez une requête sur le service de session du Serveur Ligne 1000 :

http://hostname/application/server/signin.l1000?DB=society_name&USER= ser_name&PASSWORD= user_password&RESSID=1


La réponse de serveur est de type text/plain et contient un identifiant de session. Cette opération doit être effectuée sur le serveur.

Exemple d’appel à partir d’ASP.NET :

const string querystring = "DB={0}&USERNAME={1}&PASSWORD={2}&RESSID=1";

string query = string.Format(querystring, "5.0.2 - Test - Conso Groupe", "ereport", "8BC38A379D21F5F9A1B4145BDF663835");

string L1000SID="";

query = "http://ereport/conso1000/server/signin.l1000?" + query;

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(query);

request.AllowAutoRedirect = false;

try

{

   HttpWebResponse wresponse = (HttpWebResponse)request.GetResponse();
   StreamReader loResponseStream = new StreamReader(wresponse.GetResponseStream(), Encoding.ASCII);
   L1000SID = loResponseStream.ReadToEnd();

} catch

{

    L1000SID = "";

}

Console.WriteLine(L1000SID);

Ne pas fournir d’informations d’identification.

Dans ce cas l’appel à la fonction d’ouverture de l’écran va afficher une boite de dialogues pour que l’utilisateur saisisse les informations de connexion. Ces informations seront conservées d’une ouverture d’écran à l’autre.


Exemple complet en passant les paramètres d’authentification dans l’appel de l’écran

<html>

<head>

<title>test open L1000 window</title>

<script type="text/javascript" src="../js/l1000env.js"></script>

<script>

var l1000Root="/gcf";

function Comptes() {

checkEnvL1000(callFormAlias,null,["","ecompta_comptesgeneraux.dfm","ArgPeriode=2006-12-31&ArgGroupeCompte=4000&ArgTypeFlux=F300","", "5.5.0 - Sage 1000 Entreprise - Projet", "crnit", "7B60A52ECC8DB633D57B05BCA36207ED"]);

}

</script>

</head>

<body>

Test open form

<a onclick=" Comptes();" href="#"> Comptes </a>

</body>

</html>

Outils personnels