cakephp对数据库表中的重复条目验证用户(手动验证?)

时间:2011-09-06 17:42:15

标签: cakephp authentication manual

我正在为一组网站创建一个身份验证系统。 问题是我必须使用预先存在的数据库,其中用户表已经满了条目,并且一个用户可以拥有多个帐户。基本上,用户每个可访问的网站都有一个帐户(这不是最好的方法,但我无法更改)。每个帐户都由用户表中的条目表示,登录密码名称 ...和重要的领域: 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());
        }
    }
}

我希望能够通过使用用户提交的登录/密码手动在用户表中搜索来手动授权访问当前网站,如果我找到了匹配其中一个用户帐户,授予访问权限或以其他方式拒绝访问。总而言之,避免Auth组件的所有自动化。

1 个答案:

答案 0 :(得分:0)

如果Auth组件的登录方法失败,则控制权将转移回自定义登录操作(例如UsersController::login())。我已经使用它来使用用户名或电子邮件地址进行身份验证,但它可以很容易地适应这个目的。同样的想法,不同的标准。我提出了我认为reasonably thorough response(带代码)的问题。它也可以帮到你。

相关问题