我目前正在使用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;
}
}
答案 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