Maintenant que nos utilisateurs peuvent se connecter à notre CMS, nous voulons appliquer des règles d’autorisation pour nous assurer que chaque utilisateur ne puisse éditer que les messages dont il est l’auteur. Nous allons utiliser le plugin authorization pour nous en assurer.
Le plugin Authorization représente les autorisation et les permissions par des classes Policy. Ces classes contiennent la logique pour vérifier qu’une identity a la permission de faire une action sur une ressource. Notre identity sera un utilisateur authentifié, et nos ressources sont des entités de l’ORM ainsi que des requêtes sur la base de données. Utilisons bake pour créer la base de notre première stratégie.
bin/cake bake policy --type entity Article
Cette commande va générer une classe de Police vide pour notre entity Article
.
Vous retrouverez le fichier généré dans src/Policy/ArticlePolicy.php. Maintenant,
modifiez la stratégie pour qu’elle ressemble à cela:
<?php
namespace App\Policy;
use App\Model\Entity\Article;
use Authorization\IdentityInterface;
class ArticlePolicy
{
public function canAdd(IdentityInterface $user, Article $article)
{
//Tous les utilisateurs authentifiés peuvent créer des articles.
return true;
}
public function canEdit(IdentityInterface $user, Article $article)
{
// Les utilisateurs authentifiés ne peuvent modifier que leurs articles.
return $this->isAuthor($user, $article);
}
public function canDelete(IdentityInterface $user, Article $article)
{
// Les utilisateurs authentfiés ne peuvent supprimer que leurs articles.
return $this->isAuthor($user, $article);
}
protected function isAuthor(IdentityInterface $user, Article $article)
{
return $article->user_id === $user->getIdentifier();
}
}
Ici nous n’avons défini que quelques règles basiques, libre à vous d’utiliser des logiques plus complexes.
Bien que nous ayons bloqué l’accès à l’édition, nous sommes toujours vulnérables
au changement de l’attribut user_id
de l’article par l’utilisateur durant l’édition.
Nous allons remédier à cela. Commençons avec l’action add
.
Lorsque nous créons des articles, nous voulons fixer le user_id
comme étant
l’utilisateur actuellement authentifié. Remplacez l’action add
par le code suivant:
// Dans src/Controller/ArticlesController.php
public function add()
{
$article = $this->Articles->newEmptyEntity();
$this->Authorization->authorize($article);
if ($this->request->is('post')) {
$article = $this->Articles->patchEntity($article, $this->request->getData());
// Changement: Chercher le user_id de l'utilisateur authentifié.
$article->user_id = $this->request->getAttribute('identity')->getIdentifier();
if ($this->Articles->save($article)) {
$this->Flash->success(__('Votre article a été enregistré avec succès.'));
return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('Impossible d\'ajouter votre article.'));
}
$tags = $this->Articles->Tags->find('list')->all();
$this->set(compact('article', 'tags'));
}
Ensuite nous allons modifier l’action edit
. Remplacez la méthode d’édition par ce qui suit:
// Dans src/Controller/ArticlesController.php
public function edit($slug)
{
$article = $this->Articles
->findBySlug($slug)
->contain('Tags') // charge les Tags associés
->firstOrFail();
$this->Authorization->authorize($article);
if ($this->request->is(['post', 'put'])) {
$this->Articles->patchEntity($article, $this->request->getData(), [
// Ajout: Empêcher la modification de user_id.
'accessibleFields' => ['user_id' => false]
]);
if ($this->Articles->save($article)) {
$this->Flash->success(__('Votre article a été sauvegardé.'));
return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('Impossible de mettre à jour votre article.'));
}
$tags = $this->Articles->Tags->find('list')->all();
$this->set(compact('article', 'tags'));
}
Ici nous définissons les propriétés qui peuvent être assignées en masse en
utilisant patchEntity()
. Voir la section Changer les Champs Accessibles
pour plus d’informations. N’oubliez pas d’enlever le contrôle du user_id
dans templates/Articles/edit.php, nous n’en avons plus besoin.
Nous avons construit une application CMS basique qui permet à des utilisateurs de s’authentifier, d’écrire des articles, d’y ajouter des tags, de parcourir les articles rédigés, et avons mis en place des contrôles pour nos articles. Nous avons même ajouté des améliorations à l’interface en exploitant le FormHelper et les capacités de l’ORM
Merci d’avoir pris le temps d’explorer CakePHP. Nous vous proposons de continuer votre apprentissage avec Accès Base de Données & ORM ou de lire attentivement Utiliser CakePHP.