我正在为一组网站创建一个身份验证系统。 问题是我必须使用预先存在的数据库,其中用户表已经满了条目,并且一个用户可以拥有多个帐户。基本上,用户每个可访问的网站都有一个帐户(这不是最好的方法,但我无法更改)。每个帐户都由用户表中的条目表示,登录,密码,名称 ...和重要的领域: 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组件的所有自动化。
答案 0 :(得分:0)
如果Auth组件的登录方法失败,则控制权将转移回自定义登录操作(例如UsersController::login()
)。我已经使用它来使用用户名或电子邮件地址进行身份验证,但它可以很容易地适应这个目的。同样的想法,不同的标准。我提出了我认为reasonably thorough response(带代码)的问题。它也可以帮到你。