0

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のコンポーネントのすべての自動魔法を避けてください。

4

1 に答える 1

0

Authコンポーネントのログイン方法が失敗した場合、制御はカスタムログインアクションに戻されます(例UsersController::login())。これを使用して、ユーザー名または電子メールアドレスのいずれかを使用して認証しましたが、この目的に簡単に適合させることができます。同じ考え、異なる基準。私は、同様の質問に対して、(コードを使用して)合理的に徹底した回答であると思うものを提供しました。それもあなたを助けるかもしれません。

于 2011-09-06T18:57:51.767 に答える