116 lines
6.4 KiB
Plaintext
116 lines
6.4 KiB
Plaintext
---
|
|
sidebar_position: 6
|
|
title: "CP 6"
|
|
description: "Synthèse de la CP 5 \"Développer les composants d'accès aux données\" du titre professionnel Développeur Web et Web Mobile (DWWM TP-01280m03, référentiel expiré)."
|
|
---
|
|
|
|
import Admonition from '@theme/Admonition';
|
|
|
|
# Développer les composants d'accès aux données
|
|
|
|
<Admonition type="warning" title="Attention, tu es en train de consulter un référentiel expiré !">
|
|
[Aller sur le contenu du nouveau référentiel en vigueur](/titres-professionnels/DWWM/intro)
|
|
</Admonition>
|
|
|
|
## 📚 Références
|
|
|
|
- REAC _(mise à jour du 27/04/2018)_, pages 23 et 24
|
|
- RC _(mise à jour du 19/04/2018)_, page 11
|
|
|
|
## 🚀 Contexte
|
|
|
|
Maintenant que tu connais la structure de ta base de données et qu'elle est créée, il va falloir expliquer comment ton application pourra accéder aux données stockées.
|
|
|
|
En PHP, tu connais certainement `PDO`, mais tu as peut-être également utilisé un <abbr title="Object-Relational Mapping">ORM</abbr>
|
|
comme [Eloquent](https://laravel.com/docs/11.x/eloquent) ou encore [Doctrine](https://symfony.com/doc/current/doctrine.html).
|
|
|
|
Pour NodeJS, tu as peut-être utilisé les pilotes [mysql](https://www.npmjs.com/package/mysql), [pg](https://www.npmjs.com/package/pg) ou
|
|
[sqlite](https://www.npmjs.com/package/sqlite) pour accéder à ta base de données ou encore un <abbr title="Object-Relational Mapping">ORM</abbr>
|
|
comme [Prisma](https://www.npmjs.com/package/prisma) ou [Sequelize](https://www.npmjs.com/package/sequelize).
|
|
|
|
L'idée ici est d'expliquer comment le back va se connecter à la base de données **ET** comment le back est structuré pour accéder aux données.
|
|
|
|
Tu vas donc avoir très certainement avoir besoin de parler des services et des modèles qui permettent d'accéder aux données et de les altérer.
|
|
|
|
Comme cette <abbr title="Compétence Professionnelle">CP</abbr> _(et les suivantes)_ parlent de sécurité,
|
|
c'est l'occasion de parler de ton fichier `.env` et du `.gitignore` afin de ne pas avoir de fichiers sensibles dans le repository de ton projet,
|
|
dont les informations de connexion à la base de données.
|
|
|
|
<Admonition type="warning" title="Utilisation d'ORM/query builder">
|
|
Si tu utilises un <abbr title="Object-Relational Mapping">ORM</abbr> ou un query builder, il est important de bien expliquer comment tu l'as configuré et comment tu l'utilises.
|
|
En plus d'expliquer comment cet outil a été paramétré, tu dois être en mesure d'expliquer la construction SQL générée par cet outil.
|
|
|
|
Par exemple avec Prisma :
|
|
```javascript showLineNumbers
|
|
const user = await prisma.user.findUnique({
|
|
select: {
|
|
id: true,
|
|
name: true,
|
|
email: true,
|
|
posts: {
|
|
select: {
|
|
title: true,
|
|
},
|
|
},
|
|
},
|
|
include: {
|
|
posts: true,
|
|
},
|
|
where: {
|
|
id: 1,
|
|
},
|
|
});
|
|
```
|
|
|
|
Ce qui donnera :
|
|
```sql
|
|
SELECT u.id, u.name, u.email, p.title -- Sélection des colonnes
|
|
FROM "User" u -- Table principale
|
|
INNER JOIN "Post" p ON p.userId = u.id -- Jointure avec la table "Post"
|
|
WHERE u.id = 1; -- Condition de sélection
|
|
```
|
|
|
|
_(Oui, c'est un exemple fictif et pas entièrement correspondant, mais tu as compris l'idée !)_
|
|
</Admonition>
|
|
|
|
On est d'accord : cette <abbr title="Compétence Professionnelle">CP</abbr> est un gros morceau,
|
|
mais c'est un passage obligé pour bien comprendre comment ton application va interagir avec la base de données !
|
|
|
|
## 🎯 Critères d'évaluation
|
|
|
|
- Les traitements relatifs aux manipulations des données répondent aux fonctionnalités décrites dans le dossier de conception technique
|
|
- Un test unitaire est associé à chaque composant, avec une double approche fonctionnelle et sécurité
|
|
- Les composants d'accès à la base de données suivent les règles de sécurisation reconnues
|
|
- La démarche de recherche permet de résoudre un problème technique ou de mettre en œuvre une nouvelle fonctionnalité
|
|
- La veille sur les vulnérabilités connues permet d'identifier des failles potentielles
|
|
- La documentation technique liée aux technologies associées, rédigée en langue anglaise, est comprise _(sans contre-sens, ...)_
|
|
|
|
## 🤯 Aller plus loin _(hors référentiel)_
|
|
|
|
### 🛡️ Sécurisation des données
|
|
|
|
J'imagine que dans ton application tu as des données sensibles, comme des informations personnelles ou encore des mots de passe.
|
|
En ce qui concerne les mots de passe, il est essentiel que ces derniers soient stockés de manière sécurisée, c'est-à-dire **hashés**.
|
|
Pour cela, tu peux utiliser des fonctions de hachage comme [bcrypt](https://www.npmjs.com/package/bcrypt) avec NodeJS ou encore [password_hash](https://www.php.net/manual/fr/function.password-hash.php) en PHP.
|
|
|
|
Pour les informations personnelles, tu as également la possibilité de les sécuriser en les chiffrant !
|
|
Tu peux très bien te baser sur un algorithme maison ou encore utiliser des bibliothèques comme [crypto-js](https://www.npmjs.com/package/crypto-js) en NodeJS ou encore [openssl](https://www.php.net/manual/en/book.openssl.php) en PHP.
|
|
|
|
### 🗑️ Suppression des données
|
|
|
|
<Admonition type="quote" title="Un peu de ménage ne fait jamais de mal !">
|
|
On est d'accord ! Cependant, la suppression de données est une opération délicate.
|
|
Se dire "il suffit de faire un `DELETE FROM table WHERE id = 1`" peut potentiellement poser des problèmes.
|
|
</Admonition>
|
|
|
|
En effet, il est important de bien réfléchir à la suppression de données, notamment pour les données liées à d'autres données _(les fameux `ON DELETE CASCADE` par exemple)_.
|
|
|
|
Puisque l'erreur est humaine, permettre la suppression aussi simplement que via un bouton "Supprimer" peut être risqué, même si ce dernier est protégé par un message de confirmation.
|
|
|
|
On va préférer d'une suppression logique, c'est-à-dire qu'on va "désactiver" la donnée plutôt que de la supprimer définitivement.
|
|
C'est ce qu'on appelle plus communément le **"soft delete"**, là où la suppression définitive est appelée **"hard delete"**.
|
|
|
|
Il est également important de maintenir un certain état des données stockées, notamment pour des raisons légales ou encore pour des raisons de traçabilité.
|
|
Bien entendu, lorsque l'utilisateur souhaite supprimer définitivement ses données _(<abbr title="Règlement Général sur la Protection des Données">RGPD</abbr>)_,
|
|
il est important de bien l'informer des conséquences de cette action et des délais de suppression dans la politique de confidentialité de ton application.
|