CakePhp验证登录问题

时间:2013-01-17 14:59:29

标签: php cakephp

我目前正在使用CakePhp在网站上设置一个简单的身份验证,用户可以访问任何页面,但是有一个管理系统需要登录。

授权正常,只有管理页面受到限制并被重定向到登录页面。我遇到的问题是我无法以管理员身份登录。我有一个管理记录插入数据库,密码已经过哈希处理。但是当我尝试登录时,它不会像它应该做的那样落入if($this->Auth->login())。这是我正在使用的代码:

App Controller:

class AppController extends Controller {

    public $components = array(
       'Session',
       'Auth' => array(
           'loginRedirect' => array('controller' => 'admins', 'action' => 'index'),
           'logoutRedirect' => array('controller' => 'admins', 'action' => 'index'),
       )
   );

   function beforeFilter() {

        if ($this->params['controller'] != 'admins') {
          $this->Auth->allow('*');
        }
        $this->Auth->loginAction = array('controller' => 'admins', 'action' => 'login');
  }

}

AdminsController:

class AdminsController extends AppController {
var $components = array('Auth');

public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('login');//allow the login page to be accessed.
}

public function login() {
    if($this->request->is('post')) {

            if($this->Auth->login())
            {
                return $this->redirect(array('controller' => 'admins', 'action' => 'index')); 
            }
            else
            {
                //why is it getting to this point with correct details?
                debug('failed'); exit;
            }
    }
}

不确定我是否遗漏了会导致$this->auth->login()失败的内容? 我确实尝试将其全部重命名为User而不是Admin,以查看是否是导致他发出的问题,但结果仍然相同。正在使用authcomponent通过cake添加管理员来密码密码,如下所示:

class Admin extends AppModel {

    public function beforeSave($options = array())
    {
        if(isset($this->data['Admin']['password'])) {
            $this->data['Admin']['password'] = AuthComponent::password($this->data['Admin']['password']);
        }

        return true;
    }
}

5 个答案:

答案 0 :(得分:2)

默认情况下,Auth使用用户身份验证模式。根据您的debug($this->request)输出,您似乎使用名为“Admin”的模型。因此,请在Auth组件设置中指定使用userModel键。查看手册以了解具体信息。

答案 1 :(得分:1)

只是因为任何人遇到同样的问题,我发现造成问题的原因只是一个愚蠢的错误。

我在AppController中设置了Auth组件,然后再从AdminsController中设置,如上面的代码所示。这导致了这个问题,因为它只在AppController中需要。

答案 2 :(得分:0)

我在过去遇到过类似的问题,我发现直接将$this->request->data属性直接传递给AuthComponent::login()方法有效。像这样:

$this->Auth->login($this->request->data)

唯一的问题是,只有您传递的信息才会被放入会话中。因此,在您的情况下,您只能从会话中访问用户名和密码。

我确信有一个原因可以解释为什么这不符合您的预期。

答案 3 :(得分:0)

您没有指定您使用的CakePhp版本。当我从2.0升级到2.3时,我需要更改allow参数 - CakePhp Cookbook / ACL

中的参考
public function beforeFilter() {
    parent::beforeFilter();

    // For CakePHP 2.0
    $this->Auth->allow('*');

    // For CakePHP 2.1 and up
    $this->Auth->allow();
}

答案 4 :(得分:0)

您无需在管理员控制器中定义Auth。 Insted你可以使用相同的login.ctp文件登录用户和admin(使用swith case),在Admincontroller中为安全使用此代码在beforerender中

if($this->Session->read('Auth.User.role') != 'admin')
{
 $this->Session->setFlash('Hack Attempt detecetd via.'$_SERVER['REMOTE_ADDR']);
$this->redirect('/logout');
}

在usermodel中,在before-save中将Admin替换为User

相关问题