私は正しい方向に向けられる必要があります。ユーザーがログインしてタスクリストを表示できる簡単なアプリケーションを作成しています。アプリを安全にしたい。ユーザーを認証してサイト全体にアクセスすることしかできません。明らかに、それは私が望んでいるものではありません。自分のアカウントのみにアクセスできるようにしたい。これについて読むのに良いサイトはありますか?v2.x を学んでいます。ありがとう
3 に答える
本以外のサイトは考えられませんでした。それが私の実装方法です。ログインしたユーザーをアプリ コントローラーの beforeRender コールバックに設定しました。そうすれば、すべてのコントローラーで使用できます。
次に、ダッシュボードと呼ばれるユーザーコントローラーに機能があります
function dashboard($userId = NULL) {}
userId がログに記録されたユーザーのものと一致する場合、または私の場合、ユーザーが管理者である場合は続行し、そうでない場合は許可されていないというメッセージでユーザーをリダイレクトします。
これはすべて、Auth コンポーネントのみを使用している場合です。ACL コンポーネントも使用する場合は、ユーザーがページへのアクセスも許可されているかどうかを確認する必要があります。
ソース http://book.cakephp.org/2.0/en/tutorials-and-examples/blog-auth-example/auth.html
ご質問の内容について 100% 確信があるわけではありませんが、ユーザーが自分のアカウントにのみ関連する何らかのコントロール パネルまたはインターフェイスにアクセスできるようにする必要があることは理解しています。これを達成するために私がすることは次のとおりです。
- パラメーターを取らないコントローラーで関数を設定する
- ユーザーがログインしていることを確認する
- その場合は、ユーザーの id フィールドを条件として使用しながら、必要なデータをビューに設定します。この方法を使用すると、ユーザーはアクセスしようとしているデータを指定できません。コントローラーとモデルのロジック次第です。
- そうでない場合は、別の場所にリダイレクトします
質問を編集して、達成しようとしていることについてさらに情報を提供していただければ、例を挙げたり、さらに説明したりできます。
あなたの質問はかなり一般的ですが、役立つ情報がいくつかあります。
データのリストと表示に関しては、ログインしたユーザー ID にアクセスできます。したがって、アプリ全体で、すべてのメソッドで、ログインしているユーザー ID に関連するデータをフェッチするだけです。
データの編集/削除に関しては、ログインしているユーザーの ID と、編集または削除しようとしているレコードの ID を照合する必要がある場合があります。
これは、私が掘り起こした古い CakePHP 1.3 (つまり、2.x ではない) のコードです。このメソッドは私の AppController にあり、ユーザーがレコードを編集/削除しようとしたときに呼び出され、レコードが自分のユーザー アカウントに属していることを確認しました。
function checkUserID($pUserId) {
// This is called for methods when a user can only access it for their own user account - eg, a user can call 'edit', but only on their own records.
if ($pUserId != $this->Auth->user('id')){
$this->Session->setFlash(__('You are not authorized to access that location', true));
$this->redirect($this->referer());
}
}
このメソッドの使用方法の例を挙げると、ユーザーがそのアプリでコメントを削除しようとすると、次のようになります。
$commentToDelete = $this->Comment->read(null, $id); // get the comment they are trying to delete
$this->checkUserID($commentToDelete['Comment']['user_id']); // check that it is their own comment
// If they pass the above test, then continue and delete the comment.
// If not, they will have already been redirected by the checkUserID method
ご不明な点がございましたら、お知らせください。
編集:以下のニックのコメントに応えて:
以前に isAuthorized() を使用したことがありますが、上記の例ではどのように機能するかわかりません。ユーザーがコメントを削除する場合は、次のようにする必要があります。
$this->checkUserID($commentToDelete['Comment']['user_id']); // check that it is their own comment
ただし、ウィジェットを削除する場合は、次のようにする必要があります。
$this->checkUserID($widgetToDelete['Widget']['user_id']); // check that it is their own widget
たとえば、user_id を保持する「gallery」レコードに属する「photo」レコードを編集しているため、「photo」レコード自体に「user_id」フィールドがない場合、状況はさらに複雑になる可能性があります。 .
これらの起こりうる状況を isAuthorized() で適切に処理する方法がわかりません。何か不足していますか?問題は、isAuthorized() で、ログインしているユーザーの ID を取得できることだと思いますが、他の ID と比較して、編集または削除しているレコードがそのユーザーのものであることを確認するにはどうすればよいでしょうか?