Я создаю систему аутентификации для группы сайтов.Проблема заключается в том, что мне приходится использовать ранее существующую базу данных, в которой уже есть таблица 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.