【问题标题】:How to use Auth in cakephp using mongodb如何使用 mongodb 在 cakephp 中使用 Auth
【发布时间】:2013-05-09 16:07:52
【问题描述】:

我为具有“用户名”和“密码”的用户提供了一个 mongo db 结构。我正在尝试在 cakephp 登录中使用 Auth,但它似乎对我不起作用。我尝试删除 $this->data 但仍然无效。

我的密码使用 Security::hash($this->data['User']['password'])

if(!empty($this->data))
{
   if($this->Auth->login($this->data))
   {
       echo "yes";
   }
   else{
       echo "no";
   }
}

在我的应用控制器中,我有这个:

public $components = array('DebugKit.Toolbar', 'Session', 'Auth' => array(
    'loginAction' => array(
        'controller' => 'pages',
        'action' => 'home'
    ),
    'authenticate' => array(
        'Form' => array(
            'fields' => array('username' => 'username', 'password' => 'password')
        )
    )
));

这是我调试登录方法时的结果:

array(
    'User' => array(
        'password' => '*****',
        'username' => 'test@test.com',
        'remember' => '0',
        'auto_login' => '0'
)
)

我不知道为什么我不能在 mongodb 中使用 Auth。提前感谢您的帮助。

编辑:

当我尝试取消布局时,它会在页面底部显示一个查询:

db.users.find( {"username":"test@test.com","password":"2fdf49ffc396453960802df8fc2417655d1e8fca"}, [] ).sort( [] ).limit( 1 ).skip( 0 )

我从表单中输入的密码的哈希值与正在查询的哈希值不同。哈希值应为“a2374c309ab7823dcd9b4e21dae7511f7a9c7ec5”。为什么 cakephp 将密码转换为另一个哈希值?

【问题讨论】:

  • 您使用的是哪个版本的 CakePHP?
  • 在这种情况下,您应该使用$this->request->data 而不是$this->data
  • 我已经试过了。当我这样做时,即使我的密码或用户名错误,它总是会输出“yes”。
  • 您可以尝试在登录方法的开头添加debug($this->request->data); 并发布结果吗?这可能会有所帮助。
  • 嗨@xgalvin 我修改了这个问题。谢谢

标签: php mongodb cakephp cakephp-2.3


【解决方案1】:

$this->Auth->login() 有两种使用方式。 CakePHP API documentation 解释它:

如果提供了 $user,则数据将作为登录用户存储。如果 $user 为空或未指定,则请求将用于识别用户。

manual 还提到:

在 2.0 中 $this->Auth->login($this->request->data) 将使用发布的任何数据登录用户...

所以对于用户控制器的登录方法,你不应该传递任何东西:

if($this->Auth->login()) {
    // user is now logged in
}

如果您需要手动登录用户,您可以将用户数据作为数组传递:

if($this->Auth->login($this->request->data['User'])) {
    // user is now logged in
}

$this->request->data['User'] 类似于:

array(
    'id' => 1,
    'username' => 'admin',
    'password' => '1234',
);

注意:在这两种情况下,您都不需要散列密码,因为它是自动完成的。

【讨论】:

  • 嗨@xgalvin 感谢您的回复。这是我的问题,如果我在 $this->Auth->login() 中添加一个参数,我总是得到一个“是”,但如果我不添加一个参数,我总是得到一个否。
  • 当您传递参数时,您将强制登录。如果您登录失败,那是由于身份验证错误。你在查看$this->Session->flash('auth'); 的某处吗?
  • 嗨@xgalvin,我更新了我的问题。 Cake 正在将我的密码转换为另一种类型的哈希,这就是它无法进行身份验证的原因。你能告诉我为什么会这样吗?谢谢
  • 约定优于配置!我认为您可以更改身份验证组件配置中的默认哈希方法。
【解决方案2】:

我找到了答案。这是因为 cakephp 在数据库中搜索时会自动对密码进行哈希处理。

我遇到的问题是当我保存用户密码时,我正在使用

Security::hash($this->data['User']['password'])

我应该改用这个:

AuthComponent::password($this->data['User']['password'])

感谢您提供的所有帮助,尤其是对 @xgalvin 的帮助

【讨论】:

    猜你喜欢
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2023-03-05
    • 2019-05-30
    • 1970-01-01
    相关资源
    最近更新 更多