Configuration du serveur HTTP d'Oracle grâce à la passerelle PL/SQL

jsdarges

Ce tutoriel va vous présenter comment configurer le serveur HTTP d'Oracle grâce à la passerelle PL/SQL ainsi que les ressources d'une base de données Oracle 11g R1. ♪

- Titre : Configuration du serveur HTTP d'Oracle grâce à la passerelle PL/SQL

- Auteur : jsdarges

- Parution : 4 mars 2009

- Mise à jour : 22 mars 2009

- Licence : Copyright ® 2009 DARGES Jean-Sébastien. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- II. Le schéma XDB

- II-A. Vérifier la présence du schéma XDB

- II-B. Installer le schéma XDB

- III. Configurer la passerelle

- III-A. Avec Entreprise Manager

- III-B. Avec SQLPlus

- IV. Configurer un DAD

- IV-A. Création d'un DAD

- IV-B. La page d'accueil

- IV-C. Type file dans un formulaire

- IV-D. Autres commandes utiles

- V. Les ressources en accès FTP

- V-A. Création d'une ressource

- V-B. Accès aux ressources

- VI. Conclusion

- VII. Remerciements

I - Introduction

Ce tutoriel a pour but de vous montrer comment configurer le serveur HTTP d'Oracle grâce à la passerelle PL/SQL ainsi que l'accès FTP de votre serveur Oracle Entreprise 11g R1 grâce au schéma XDB.

Il s'adresse à un public confirmé en base de données Oracle et en développement PL/SQL.

Pour savoir comment installer Oracle 11g reportez-vous aux articles suivant : https://oracle.developpez.com/guide/installation/.

II - Le schéma XDB

XDB ?? Késaco ?? XDB : XML Database est un schéma qui permet de sauvegarder entre autres, les paramètres de configuration de la passerelle PL/SQL ainsi que les ressources.

II-A - Vérifier la présence du schéma XDB

Dans une invite de commande, tapez les commandes suivantes :

> sqlplus /nolog
SQL> connect sys/password as sysdba
SQL> SELECT status, version, comp_name FROM dba_registry WHERE lower(comp_name) like 'oracle xml%';

Si le schéma XDB est installé vous devriez avoir le résultat suivant et vous pouvez directement aller au paragraphe III sinon allez au paragraphe II-B.

STATUS

VERSION

COMP_NAME

VALID

Oracle XML Database

11.1.0.6.0

II-B - Installer le schéma XDB

Si le schéma XDB n'est pas installé, vous devez le faire impérativement.

Commencez par créer un utilisateur XDB avec un tablespace attribué. En tant qu'utilisateur XDB, lancez le script catqm.sql se trouvant dans le dossier $ORACLE_HOME/rdbms/admin. Il créera les tables et les vues nécessaires.

Reconnectez vous avec le compte SYS et lancez maintenant le script $ORACLE_HOME/rdbms/admin/catxdbj.sql qui chargera les librairies Java.

III - Configurer la passerelle

Pour configurer XDB, deux méthodes sont à votre disposition : en mode graphique avec Entreprise Manager ou en command SQL. Nous étudierons les deux méthodes en parallèle.

Une fois configurée, la passerelle HTTP vous permettra d'accéder à vos pages web via vos procédures.

III-A - Avec Entreprise Manager

Connectez vous avec le compte SYS sur Entreprise Manager à l'adresse suivante : https://localhost:1158/em.

Cliquez sur l'onglet [Schémas] pour accéder à la configuration du schéma XDB (encadré en rouge).

Cliquez ensuite sur le lien « Configuration » du schéma Oracle XML DB.

Remplir ensuite les champs « Port http » et « Port https » (si nécessaire) ainsi que le champ « Protocole HTTPS ». Ces ports vous permettront d'accéder à votre site Internet en mode sécurisé et non sécurisé. Vous pouvez également modifier les valeurs des autres champs.

Voici un exemple de configuration :

Cliquez enfin sur le bouton [OK] pour enregistrer les modifications.

Si vous changez les valeurs des champs avec une étoile, il vous faudra redémarrer la base de données pour qu'elles prennent effet.

III-B - Avec SQLPlus

Lancez SQLPlus dans une invite de commande et connectez avec le compte SYS.

Voici les commandes qui vous seront nécessaires pour configurer la passerelle :

Modifier le port d'écoute HTTP

SQL> CALL DBMS_XDB.SETHTTPPORT(80);
SQL> ALTER SYSTEM REGISTER;

Modifier le port d'écoute FTP

SQL> CALL DBMS_XDB.SETFTPPORT(21);
SQL> ALTER SYSTEM REGISTER;

Maintenant que les ports ont été configurés, vous pouvez vérifier dans la vue XDB.XDB$ROOT_INFO que tout est OK.

Voici la description de la table :

desc XDB.XDB$ROOT_INFO

RESOURCE_ROOT         ROWID
RCLIST                RAW(2000)
FTP_PORT              NUMBER(5)
FTP_PROTOCOL          VARCHAR2(4000)
HTTP_PORT             NUMBER(5)
HTTP_PROTOCOL         VARCHAR2(4000)
HTTP_HOST             VARCHAR2(4000)
HTTP2_PORT            NUMBER(5)
HTTP2_PROTOCOL        VARCHAR2(4000)
HTTP2_HOST            VARCHAR2(4000)
NFS_PORT              NUMBER(5)
NFS_PROTOCOL          VARCHAR2(4000)

IV - Configurer un DAD

Un DAD (Database Access Descriptor), pour faire simple, est un espace web où seront interprétées vos procédures comme page web. Par comparaison, c'est comme une section <Directory> </Directory> dans une configuration d'un serveur Apache où vous pourrez donner des droits d'accès…

Dans ce paragraphe nous allons créer un DAD nommé « developpez » dont l'utilisateur userDev sera le schéma qui contiendra les procédures du site Internet.

IV-A - Création d'un DAD

Après avoir créé un utilisateur « userDev » avec le mot de passe « userDevPass » (par exemple), et les droits qui vous semblent nécessaires (create procedure, create table…), lancez une invite de commande et connectez-vous avec le compte SYS. Puis lancez les commandes suivantes :

Création du DAD

SQL> exec DBMS_EPG.create_dad (dad_name => 'developpez', path => '/developpez/*');

Page par défaut du DAD

SQL> exec DBMS_EPG.set_dad_attribute (dad_name => 'developpez', attr_name => 'default-page', attr_value => 'home');

Schéma utilisé pour le DAD

SQL> exec DBMS_EPG.set_dad_attribute (dad_name => 'developpez', attr_name => 'database-username', attr_value => 'USERDEV');

Toujours indiquer la valeur de l'attribut « database-username » en majuscules.

Mode d'authentification

SQL> exec DBMS_EPG.SET_DAD_ATTRIBUTE (dad_name => 'developpez', attr_name => 'authentication-mode', attr_value => 'Basic');

Autorisation sur le DAD

SQL> exec DBMS_EPG.AUTHORIZE_DAD ( dad_name => 'developpez', user => 'USERDEV' );

Pour finir si vous ne souhaitez pas avoir de Prompt à chaque appel de procédure de votre site Internet, activer le compte ANONYMOUS avec la commande suivante :

SQL> ALTER USER anonymous ACCOUNT UNLOCK;

IV-B - La page d'accueil

Pour vérifier que le DAD est bien configuré, créez une procédure nommée HOME avec le schéma userDEV qui affichera la configuration du DAD comme cet exemple :

create or replace PROCEDURE home IS
l_attrNames    DBMS_EPG.VARCHAR2_TABLE;
l_attrValues   DBMS_EPG.VARCHAR2_TABLE;
l_dadName VARCHAR2(20) := 'developpez';

BEGIN

htp.p('<html>
<head>
<title>Ma page d''accueil</title>
</head>

<body>

<h1>Bienvenue sur votre DAD</h1>

<h3>Attributs :</h3>');

DBMS_EPG.GET_ALL_DAD_ATTRIBUTES(l_dadName,l_attrNames,l_attrValues);

htp.p('<ul>');

FOR i IN 1..l_attrNames.COUNT LOOP
htp.p('<li>' || LPAD(l_attrNames(i),20)||' : '||l_attrValues(i) || '</li>');
END LOOP;

htp.p('</ul>');
htp.p('   </body
</html>');

END home;

Pour accéder à cette page, allez à l'adresse suivante : http://localhost/developpez/home.

IV-C - Type file dans un formulaire

Si vous comptez créer un formulaire pour uploader des documents (images, PDF, doc…), il vous faut paramétrer le DAD pour accepter ce genre de transfert.

Commencez par créer une table qui sauvegardera vos documents :

CREATE TABLE uploaded_documents (
name           VARCHAR2(256) UNIQUE NOT NULL,
mime_type      VARCHAR2(128),
doc_size       NUMBER,
dad_charset    VARCHAR2(128),
last_updated   DATE,
content_type   VARCHAR2(128),
blob_content   BLOB
)

Maintenant que notre table est créée, il est nécessaire de créer des procédures qui téléchargeront et afficheront les liens vers nos documents. Pour cela je conseille de mettre toutes ces procédures dans un seul package.

Description du package

create or replace PACKAGE pckg_files AS
-- Procédure pour télécharger un fichier
PROCEDURE file_form;

-- Procédure pour charger les données relatives au téléchargement en base
PROCEDURE upload_file (file  IN  VARCHAR2);

-- Procédure utilisée par le DAD pour télécharger les documents en type BLOB
PROCEDURE download;

END;

Corps du package

create or replace PACKAGE BODY pckg_files AS

PROCEDURE file_form AS

BEGIN
htp.p('<html>
<head>
<title>Transfert de fichier</title>
<head>

<body>');

htp.p('<h1>Transfert de fichier</h1>');

htp.p('<form enctype="multipart/form-data" action="pckg_files.upload_file" method="post">
Chemin <input type="file" name="file"> <input type="submit" value="Envoyer">
</form>');

htp.p('   </body>
</html>');
END file_form;
-- ----------------------------------------------------------------------------

-- ----------------------------------------------------------------------------
PROCEDURE upload_file (file  IN  VARCHAR2) AS
-- ----------------------------------------------------------------------------
l_real_name  VARCHAR2(1000);
BEGIN

htp.p('<html>
<head>
<title>Fichier transféré</title>
<head>

<body>');

htp.p('<h1>Etat du fichier téléchargé</h1>');

l_real_name := SUBSTR(file, INSTR(file, '/') + 1);

BEGIN
-- Supprime un fichier déjà existant en base
DELETE FROM uploaded_documents
WHERE  name = l_real_name;

-- Met à jour le vrai nom du fichier
UPDATE uploaded_documents
SET    name = l_real_name
WHERE  name = file;

HTP.p('<p>Transfert du fichier ' || l_real_name || ' réussi.</p>');
EXCEPTION
WHEN OTHERS THEN
HTP.p('<p>Erreur de transfert du fichier ' || l_real_name || '.</p>');
HTP.p(SQLERRM);
END;
HTP.p('<br /><br />');

HTP.p('<h4>Fichiers téléchargés :</h4>');

-- Liens pour afficher les documents
FOR cur_rec IN (SELECT name FROM uploaded_documents) LOOP
htp.p('<ul>');
htp.p('<li><a href="docs/' || cur_rec.name || '" >docs/' || cur_rec.name || '</a></li>');
htp.p('</ul>');
END LOOP;

htp.p('   </body>
</html>');

END upload_file;

PROCEDURE download IS

l_filename  VARCHAR2(255);
BEGIN
l_filename := SUBSTR(OWA_UTIL.get_cgi_env('PATH_INFO'), 2);
WPG_DOCLOAD.download_file(l_filename);
EXCEPTION
WHEN OTHERS THEN
HTP.p('<h4 style="color: red">Téléchargement du fichier ' || l_filename || ' a échoué.</h4>');
HTP.p(SQLERRM);
END download;

END;

Pour plus d'informations sur le package « WPG_DOCLOAD », cliquez sur le lien suivant : http://www.psoug.org/reference/wpg_docload.html

Configurez maintenant le DAD en lançant les commandes suivantes :

Table où seront sauvegardés les documents

SQL> DBMS_EPG.set_dad_attribute  ( dad_name => 'developpez', attr_name => 'document-table-name', attr_value => 'uploaded_documents' );

Chemin vers les documents téléchargés

SQL> DBMS_EPG.set_dad_attribute('developpez','document-path','docs');

La valeur de l'attribut « document-path » peut être modifiée, mais il faudra également le faire dans le package « pckg_files ».

Procédure utilisée par le DAD pour télécharger les documents

SQL> DBMS_EPG.set_dad_attribute('developpez','document-procedure', 'pckg_files.download');

IV-D - Autres commandes utiles

Suppression du DAD

SQL> exec DBMS_EPG.DROP_DAD('developpez');

Ne plus autoriser l'utilisateur sur le DAD

SQL> exec DBMS_EPG.deauthorize_dad('developepz', 'USERDEV');

Supprime un attribut du DAD (ici le mode d'authentification)

SQL> DBMS_EPG.delete_dad_attribute('developpez', 'authentication-mode');

Remplacez la valeur « developpez » par le nom de votre DAD dans toutes les commandes et scripts précédents.

V - Les ressources en accès FTP

Après avoir configuré dans le paragraphe III, la passerelle HTTP ainsi que FTP, nous allons voir comment configurer et utiliser les ressources FTP.

V-A - Création d'une ressource

Connectez-vous à Entreprise Manager avec le compte SYS et cliquez sur l'onglet « Schéma ». Puis dans la section « Oracle XML DB », cliquez sur « Ressources ».

Ressources XDB

Comme vous pouvez le constater, il y a déjà des ressources présentes. Elles sont déjà accessibles via l'URL : http://localhost/. Un Prompt vous demande de vous identifier. Vous pouvez indiquer les identifiants du compte USERDEV.

Nous allons maintenant, pour illustrer l'ajout d'une ressource, ajouter un dossier avec pour accès l'utilisateur USERDEV. Cliquez sur le bouton [Créer].

Dans cette fenêtre, laissez la valeur du champ propriétaire à SYS. Puis indiquez, le nom de la ressource, puis le chemin d'accès à cette ressource. Sélectionnez « Dossier de ressource Oracle XML DB » dans le menu déroulant « Type ».

Dossier de ressource

Cliquez maintenant sur l'onglet « Sécurité » pour donner les droits d'accès aux utilisateurs.

Dans cette page, vous pouvez choisir des fichiers de paramètres par défaut ou en créer un autre.

Cliquez sur le bouton [Modifier] pour en modifier un. Nous, nous allons en créer un nouveau. Pour cela, cliquez sur le bouton [Créer].

Dans cette fenêtre, laissez la valeur du champ propriétaire à SYS. Puis indiquez, comme dossier acl « /sys/acls » car c'est ici que sont sauvegardées toutes les acl des ressources. Donnez un nom à l'acl et une description.

Il ne vous reste plus qu'à ajouter les utilisateurs et choisir leurs droits d'accès à la ressource. Voici un exemple :

Cliquez sur le bouton [OK].

Notez que j'ai donné tous les droits au propriétaire de la ressource et uniquement le droit de lecture à l'utilisateur USERDEV en accès WebDAV.

Votre acl est maintenant créée, il faut maintenant la sélectionner dans la liste déroulante et cliquez sur [OK] pour créer une ressource.

V-B - Accès aux ressources

Une fois vos ressources créées, vous pouvez y accéder soit en FTP soit en WebDAV suivant les droits que vous avez accordés aux ressources et aux utilisateurs.

VI - Conclusion

Durant ce tutoriel vous avez appris à configurer la passerelle PL/SQL et les accès aux ressources FTP et WebDAV. Vous voilà prêt à créer votre premier site Internet. Voir le tutoriel d'Helyos à cette adresse : https://helyos.developpez.com/htp/

VII - Remerciements

Je remercie Joris Crozier pour sa relecture. Ainsi que Fleur-Anne Blain et Vincent Rogier pour leur aide.