0

我正在为一组网站创建一个身份验证系统。问题是我必须使用一个预先存在的数据库,它有一个用户已经充满了条目,并且一个用户可以有多个帐户。基本上,用户可以访问的每个网站都有一个帐户(这不是最好的方法,但我无法更改)。每个帐户都由users表中的一个条目表示,包括loginpasswordname ... 和重要字段: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 组件的所有自动化。

4

1 回答 1

0

如果 Auth 组件的登录方法失败,控制权将转回自定义登录操作(例如UsersController::login())。我已经使用它来使用用户名或电子邮件地址进行身份验证,但它可以很容易地用于此目的。相同的想法,不同的标准。我对类似问题提供了我认为是相当彻底的回应(带有代码)。它也可能对您有所帮助。

于 2011-09-06T18:57:51.767 回答