0

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

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

应用控制器:

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');
  }

}

管理员控制器:

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 以查看是否是导致他出现问题的原因,但结果仍然相同。通过 cake 添加管理员,使用 authcomponent 对密码进行哈希处理,如下所示:

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;
    }
}
4

5 回答 5

3

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

于 2013-01-17T19:25:49.483 回答
1

万一有人遇到同样的问题,我找到了导致问题的原因,这只是一个愚蠢的错误。

我已经在 AppController 中设置了 Auth 组件,然后又在 AdminsController 中设置了,正如您从上面的代码中看到的那样。这是导致问题的原因,因为它仅在 AppController 中需要。

于 2013-04-18T15:31:39.660 回答
0

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

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

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

我敢肯定,为什么这不能按您的预期工作是有原因的。

于 2013-01-18T14:43:51.500 回答
0

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

public function beforeFilter() {
    parent::beforeFilter();

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

    // For CakePHP 2.1 and up
    $this->Auth->allow();
}
于 2013-03-30T00:31:23.153 回答
0

您不需要在管理控制器中定义 Auth。Insted 您可以使用相同的 login.ctp 文件为用户和管理员登录(使用 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 中,在保存前将 Admin 替换为 User

于 2013-08-25T23:46:43.510 回答