0

アプリケーションの一部では、ユーザーが URL を変更することで悪いことをする可能性があります。たとえば、編集のリクエストを変更するとします。

http://website.com/edit/4000

しかし、彼らはポスト 4000 を所有しておらず、そこにたどり着く唯一の方法は URL 操作でした。

このような場合、単純にホームページにリダイレクトしたいと考えています。ただし、これらのキャッチのいずれかをトリガーした場合は、自分自身にメッセージを表示したいと考えています。(単純なリダイレクトの問題ではありません)

これをブートストラップに入れました。

function security_redirect ($msg) {
    if ((not_an_admin) == 1) {
       $this->redirect(array('controller' => 'site', 'action' => 'index'));
    } else {
        die($msg);
    }
}

エラーメッセージが表示されます:

Using $this when not in object context

私が実行するとき:

security_redirect("Tried to edit a post that isn't yours!");

私に何ができる?私は何を間違っていますか?オブジェクトの内部にあると見なされない理由がわかりません...しかし、おそらくそれは明らかです。

4

1 に答える 1

4

これにはおそらくグローバル メソッドを使用せず、そのような状況では例外をスローするのが最善です。マニュアルのこの部分を読んで、CakePHP の組み込み例外

例えば;

class PostsController extends AppController {

    public function edit ($id)
    {
        if (user isn't allowed to edit this post) {
            throw new ForbiddenException('You are not allowed to edit this post');
        }
    }

}

die()例外は単体テストでテストでき、CakePHP エラーハンドラーによって処理され、スタイルも設定できるエラーページが出力されるため、これは使用するよりも優れたアプローチです。

余分な例

アプリ内でフィードバック メッセージを設定するには、SessionComponent::setFlash()

コントローラー内でリダイレクトを実行してメッセージを出力し、その関数 (メソッド) をアプリ内のすべてのコントローラーで使用できるようにするには、次のようなものを使用します。

アプリ/コントローラー/AppController.php

class AppController extends Controller
{    
    protected function security_redirect ($msg)
    {
        if ((not_an_admin) == 1) {
            // optionally, set 'flash' message
            $this->Session->setFlash($msg);
            return $this->redirect(array('controller' => 'site', 'action' => 'index'));
        } else {
            throw new ForbiddenException($msg);
        }
    }
}

他のコントローラー内では、このメソッドに次のようにアクセスできます。

class PostsController extends AppController
{    
    public function edit ($id)
    {
        if (/* user isn't allowed to edit this post */) {
            return $this->security_redirect('You are not allowed to edit this post');
        }
    }    
}
于 2013-05-12T00:05:58.367 に答える