CakePHP аутентифицировать пользователя с повторными записями в таблице базы данных (ручная аутентификация?) - PullRequest
0 голосов
/ 06 сентября 2011

Я создаю систему аутентификации для группы сайтов.Проблема заключается в том, что мне приходится использовать ранее существующую базу данных, в которой уже есть таблица users , и в ней один пользователь может иметь несколько учетных записей.По сути, у пользователя есть одна учетная запись на каждый веб-сайт, к которому он имеет доступ (это не лучший способ сделать это, но я не могу изменить его).Каждая учетная запись представлена ​​записью в таблице users с login , password , name ... и важным полем: website_id .Это поле указывает системе, к какому веб-сайту имеет доступ эта учетная запись.

Большая проблема заключается в том, что некоторые пользователи с несколькими учетными записями имеют одинаковую информацию для входа в систему и пароль для всех них.Например, у одного пользователя есть 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 и использует эти учетные данные, ему предоставлен доступ.Если он заходит на веб-сайт с id = 4 , ему запрещен доступ.

Моя проблема заключается в том, что, поскольку CakePHP выполняет вход в систему автоматически, когда пользователь пытается войти, CakePHP проверяет только первая запись в базе данных, которая соответствует логину / паролю, введенному в форму.Поэтому, если пользователь в настоящее время находится на веб-сайте с website_id = 3 и пытается войти в систему, Cake находит первую запись (account1), сравнивает ее website_id (1 в данном случае) сидентификатор текущего веб-сайта (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());
        }
    }
}

Я хотел бы иметь возможность вручную авторизовать доступ к текущему веб-сайту, используя введенные пользователем логин / пароль для ручного поиска в таблице users , и если я найду совпадение в одном изучетные записи пользователей, предоставить доступ или иным образом запретить доступ.Подводя итог, избегайте всех автоматических компонентов Auth.

1 Ответ

0 голосов
/ 06 сентября 2011

В случае сбоя метода входа компонента Auth управление возвращается обратно к пользовательскому действию входа (например, UsersController::login()). Я использовал это для аутентификации, используя имя пользователя или адрес электронной почты, но это может быть легко адаптировано для этой цели. Та же идея, разные критерии. Я предложил, как мне кажется, достаточно тщательный ответ (с кодом) на аналогичный вопрос. Это может помочь и вам.

...