【发布时间】:2011-09-06 17:42:15
【问题描述】:
我正在为一组网站创建一个身份验证系统。 问题是我必须使用一个预先存在的数据库,它有一个 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)到当前网站的 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());
}
}
}
我想要的是能够通过使用用户提交的登录名/密码在users表中手动搜索来手动授权访问当前网站,如果我找到了匹配其中一个用户帐户,授予访问权限,或以其他方式拒绝访问。综上所述,避免 Auth 组件的所有自动化。
【问题讨论】:
标签: cakephp authentication manual