2012-06-20 22 views
0

J'ai ceci dans mon contrôleur.CakePHP: Méthode correcte pour supprimer un enregistrement en toute sécurité

public function delete($id) { 
    if($this->request->is('get')) { 
     throw new MethodNotAllowedException(); 
    } 

    $this->Memberlist->id = $id; 
    if (!$this->Memberlist->exists()) { 
     throw new NotFoundException(__('Invalid list.')); 
    } 
    if ($this->Memberlist->delete()) { 
     $this->Session->setFlash(__('List deleted.'), 'success'); 
     return $this->redirect(array('action'=>'index')); 
    } 
    $this->Session->setFlash(__('List was not deleted.'), 'error'); 
    return $this->redirect(array('action'=>'index')); 
} 

Mon modèle ressemble à ceci: (belongsTo)

<?php 

class Memberlist extends AppModel { 
    public $name = 'Memberlist'; 
    public $belongsTo = array(
      'Account' => array(
      'className' => 'Account', 
      'foreignKey' => 'account_id' 
     ) 
    ); 

Dans un de mes vues, j'ai quelque chose comme ceci:

echo $this->Form->postLink('Delete', 
        array('action' => 'delete', $list['Memberlist']['id']), 
        array('class'=>'btn-mini btn', 'confirm' => 'Are you sure?')); 

Ce qui crée un HTML comme ceci:

<form id="post_4fe15efc0d284" method="post" style="display:none;" name="post_4fe15efc0d284" action="/Grid/memberlists/delete/9"> 
<input type="hidden" value="POST" name="_method"> 
<input id="Token1627936788" type="hidden" value="8756f7ad21f3ab93dd6fb9a4861e3aed4496f3f9" name="data[_Token][key]"> 
<div style="display:none;"> 
</form> 
<a class="btn-mini btn" onclick="if (confirm('Are you sure?')) { document.post_4fe15efc0d284.submit(); } event.returnValue = false; return false;" href="#">Delete</a> 

Le problème est que quand je mets à jour le ID trouvé dans action="/Grid/memberlists/delete/9" en utilisant Firebug (ou n'importe quel outil de développement), je peux pratiquement tout effacer! Même à partir d'un compte différent. Même si le composant de sécurité est activé.

Quelle serait la bonne façon de procéder? Je pense à vérifier le account_id par rapport au account_id de l'utilisateur actuellement connecté. Mais je suis juste curieux de savoir si CakePHP a quelque chose d'out-of-the-box qui résout ce problème?

Répondre

3

Vous pouvez ajouter un rappel beforeDelete dans votre modèle, et interroger la base de données et vérifier si l'utilisateur est autorisé à supprimer l'enregistrement et/ou s'il est le propriétaire.

+0

Je suis nouveau à CakePHP et a trouvé cette réponse pour être très simple à mettre en œuvre. Il a également fait beaucoup de sens de le faire dans le modèle. – wenbert

2

Pour vraiment empêcher vos utilisateurs d'effectuer différentes actions, telles que la suppression de choses qui n'appartiennent pas à l'utilisateur, vous devez utiliser le Auth Component.

Je suppose que le modèle Account stocke les données utilisateur. Vous devrez suivre le tutoriel dans le livre de cuisine, mais j'ai souligné comment la permission serait refusée pour la suppression.

Votre méthode isAuthorized ressemblerait à quelque chose comme ceci:

public function isAuthorized($account) { 
    // The owner of a post can edit and delete it 
    if (in_array($this->action, array('edit', 'delete'))) { 
     $memberListId = $this->request->params['pass'][0]; 
     if ($this->MemberList->isOwnedBy($memberListId, $account['id'])) { 
      return true; 
     } 
    } 

    // Default deny 
    return false; 
} 

Et cela irait dans le modèle:

public function isOwnedBy($memberList, $account) { 
    return $this->field('id', array('id' => $memberList, 'account_id' => $account)) === $post; 
} 
Questions connexes