Webサイトのグループの認証システムを作成しています。問題は、既存のデータベースを使用する必要があることです。このデータベースには、すでにエントリでいっぱいのusersテーブルがあり、1人のユーザーが複数のアカウントを持つことができます。基本的に、ユーザーはアクセスできるWebサイトごとに1つのアカウントを持っています(これを行うのに最適な方法ではありませんが、変更することはできません)。各アカウントは、ログイン、パスワード、名前...、および重要なフィールドであるwebsite_idを含むusersテーブルのエントリで表されます。このフィールドは、そのアカウントがアクセスできるWebサイトをシステムに通知します。
大きな問題は、複数のアカウントを持つ一部のユーザーが、すべてのユーザーに対してまったく同じログイン/パスワード情報を持っていることです。たとえば、1人のユーザーが3つのアカウントを持っているとします。
- account1: login = charly / pwd = 1234 / name = Charles ... website_id = 1
- account2: login = charly / pwd = 1234 / name = Charles ... website_id = 2
- account3: login = charly / pwd = 1234 / name = Charles ... website_id = 3
したがって、id = 2のWebサイトにアクセスし、それらの資格情報を使用すると、アクセスが許可されます。id = 4のWebサイトにアクセスすると、アクセスが拒否されます。
私の問題は、CakePHPが自動的にログインを行うため、ユーザーがログインしようとすると、CakePHPは、フォームで送信されたログイン/パスワードに一致するデータベースの最初のエントリのみをチェックすることです。したがって、ユーザーが現在website_id = 3のWebサイトにいてログインしようとすると、Cakeは最初のエントリ(account1)を見つけ、そのwebsite_id(この場合は1)を現在のWebサイトのID(3)と比較します。別の方法として、アクセスは許可されませんが、許可する必要があります。_website_idとアカウントのwebsite_idの比較は、login()関数ですでに手動で行われていることに注意してください_。
login()関数は次のようになります。
function login() {
$userInfo = $this->Auth->user();
if ( isset($userInfo) ) {
if ($userInfo['User']['website_id'] == $this->website_id) {
//Users gets access to a website that he has an account for
}
else {
//User is denied access because his account is not registered for the current website
$this->Session->destroy();
$this->Session->setFlash(__('You don't have access to this website', true));
$this->redirect($this->Auth->logout());
}
}
}
ユーザーが送信したログイン/パスワードを使用してユーザーテーブルを手動で検索することにより、現在のWebサイトへのアクセスを手動で承認できるようにし、ユーザーアカウントのいずれかで一致するものが見つかった場合は、アクセス、またはアクセスを拒否します。要約すると、Authのコンポーネントのすべての自動魔法を避けてください。