【问题标题】:cakephp authenticate user with repeated entries in the Database table (manual authentication?)cakephp 使用数据库表中的重复条目对用户进行身份验证(手动身份验证?)
【发布时间】:2011-09-06 17:42:15
【问题描述】:

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


    【解决方案1】:

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

    【讨论】:

    • 感谢您的回复!我认为这就是我正在寻找的东西。就这样我知道我的代码是正确的,你实际授权给用户的语句是$this->Auth->login( $user ) 对吗?
    • 正确。 “手动”对用户进行身份验证。作为另一个例子,我在用户注册后立即调用它,这样他/他就不必被发送到登录页面进行身份验证。因为他/她刚刚注册,所以我觉得很安全,可以节省他们的精力并直接登录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 2021-02-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    相关资源
    最近更新 更多