2012-02-29 10 views
1

公開、公開解除、閉じるなど、アプリケーションの特定のメソッドを保護したいと考えています。保護によって、私はユーザー認証を意味するのではなく、メソッドを特定の方法で呼び出すことができます。GETではなくPOSTを使用してCakePHPのメソッドを保護する

GETではなくPOSTを使用して呼び出すメソッドを強制することを考えました。そのため、人はアドレスにURLを貼り付けることができません。しかし、これは、各メソッド呼び出しごとに異なるフォームで各ボタンをラップすることを意味します。

また、GUIDを使用してGETメソッドを許可することもできますが、正しい人のみがその機能を実行できるようにすることができます。

これに関するご意見はありますか?

function publish($id = null) 
    { 
     $post = $this->Post->find('first',array('conditions'=>array('Post.id'=>Tiny::reverseTiny($id)))); 

     if ($this->request->is('post') || $this->request->is('put')) 
     { 
      $this->Post->id = $post['Post']['id']; 
      $this->Post->saveField('status', 1); 
      $this->Session->setFlash('Your post has been published!'); 
      $this->redirect(array('controller'=>'posts','action'=>'view','id'=>Tiny::toTiny($post['Post']['id']))); 
     } 
     else 
     { 
      die('GET METHOD NOT ALLOWED'); 
     } 
    } 

をしかし、それは前述したように、この方法のためのリンク/ボタンは、このメソッドにアクションの呼び出しを含む形態であることが必要となる意味:

は、これまで私が試してみました。そして、私はいくつかの方法を持っている場合、私は私が考えている

乾杯

一つの方法は、getメソッドを許可して、ユーザーIDでログインして比較したポストのユーザIDをチェックしている...いくつかの形式が必要になりますそうですね:

if ($this->request->is('get')) 
     { 
      if($post['Post']['user_id'] != $this->Auth->user('id')) 
      { 
       $this->Session->setFlash('You don\'t have permission to edit that post!'); 
       $this->redirect(array('controller' => 'posts', 'action' => 'index')); 
      } 
      else 
      { 
       $this->Post->id = $post['Post']['id']; 
       $this->Post->saveField('status', 1); 
       $this->Session->setFlash('Your post has been published!'); 
       $this->redirect(array('controller'=>'posts','action'=>'view','id'=>Tiny::toTiny($post['Post']['id']))); 
      } 
     } 

これはいいですか? (ここではCakePHPの2.0を仮定)

+0

私はStackOverflow経由でたくさんのものを学んでいるので、それが私を助けている場合は、たくさんの質問をしても害はありません。人々はオンラインコミュニティでさまざまな役割を担います。私は大学の私の論文をユーザーの心理学に書いた。あなたはそれのいくつかを読んでください:) http://www.google.co.uk/search?aq = 0&oq = social + roles + in + sourceid = chrome&ie = UTF-8&q = social + roles + in + online + communities誰もが同じやり方でやりとりするわけではなく、 – Cameron

答えて

6

まず、むしろポスト上のダイを呼び出すよりも、チェック/取得します。例外をスローし、ケーキ中の例外は(Exceptions)素晴らしいです:

if (!$this->request->is('get')) { 
    throw new MethodNotAllowedException(); 
} 

ケーキはまたあなたのテンプレートに(郵送)を削除するためのリンクを生成するための方法を提供します。

<?php echo $this->Form->postLink('Delete', 
    array('action' => 'delete', $post['Post']['id']), 
    array('confirm' => 'Are you sure?')); 
?> 

編集(リンク):postLink

これは、スタックオーバーフローの私の最初の答えです。それが役に立ちましたことを願っています。

+0

+1。これは正しいアプローチです。 –

+0

@arcynumそれは私にとっては役に立ちます.....ありがとう........ –

1

特定のユーザーだけが機能を実行できるようにするには、ACLや何らかの形式のアクセス許可が必要なように聞こえます。投稿したようなもの(if($post['Post']['user_id'] != $this->Auth->user('id')))を使用しない理由は、コードベースを通して多くの関数でそのコードを複製することになるからです。それは非常にお粗末です。

ただし、提出が特定の方法で提出されたことを確認したい場合は、スローエラーメソッドを使用してください。そして、あなたはそうのように同じ関数内提出を保つことができる必要があります:最小限のコード ます$ this->要求 - > allowMethod(「ポスト」)で

public function publish($id = null) { 
    if (!$id || !$this->request->is('get') || !$this->request->is('post') || !$this->request->is('put')) { 
     throw new MethodNotAllowedException(); 
    } 

    if ($this->request->is('post') || $this->request->is('put')) { 
      $this->Post->id = $post['Post']['id']; 
      $this->Post->saveField('status', 1); 
      $this->Session->setFlash('Your post has been published!'); 
      $this->redirect(array('controller'=>'posts','action'=>'view','id'=>Tiny::toTiny($post['Post']['id']))); 
    } 

    if ($this->request->is('get')) { 
     // perform your get request here 
    } 

} 
関連する問題