我正在为一组网站创建一个身份验证系统。问题是我必须使用一个预先存在的数据库,它有一个用户表已经充满了条目,并且一个用户可以有多个帐户。基本上,用户可以访问的每个网站都有一个帐户(这不是最好的方法,但我无法更改)。每个帐户都由users表中的一个条目表示,包括login、password、name ... 和重要字段:website_id。该字段告诉系统该帐户可以访问哪个网站。
最大的问题是,一些拥有多个账户的用户拥有完全相同的登录名/密码信息。例如,一个用户有 3 个帐户:
- account1:登录 = charly / pwd = 1234 / name = Charles ... website_id = 1
- account2:登录 = charly / pwd = 1234 / name = Charles ... website_id = 2
- account3:登录 = charly / pwd = 1234 / name = Charles ... website_id = 3
因此,如果他访问id = 2的网站并使用这些凭据,他就会被授予访问权限。如果他访问id = 4的网站,他将被拒绝访问。
我的问题是,由于 CakePHP 自动登录,当用户尝试登录时,CakePHP只检查数据库中与表单中提交的登录名/密码匹配的第一个条目。因此,如果用户当前在website_id = 3的网站并尝试登录,Cake 会找到第一个条目(account1),将其website_id(在本例中为 1)与当前网站的 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());
}
}
}
我想要的是能够通过使用用户提交的登录名/密码在用户表中手动搜索来手动授权访问当前网站,如果我在其中一个用户帐户中找到匹配项,授予访问,或以其他方式拒绝访问。总而言之,避免 Auth 组件的所有自动化。