无法在Cake php中使用AuthComponent登录

时间:2014-02-08 07:13:37

标签: php cakephp authentication

我想这是一个愚蠢的问题,但我无法登录我正在Cake建立的网站的受限制部分。

为了开始,我发现$this->request->data['Usuario']['clave']中的密码字符串与模型中SimplePasswordHasher函数中使用beforeSave的散列字符串不同。我还应该说模型不是默认的用户模型,因为我正在为西班牙语编写应用程序而我不想使用默认模型,所以我的组件配置是:

class AppController extends Controller {
    /*function beforeFilter() {
        date_default_timezone_set('America/Mexico_City');
    }*/
    public $components = array(
        'Session',
        'Auth' => array(
            'Form'=>array(
                'userModel' => 'Usuario',
                'unauthorizedRedirect' => false,
                'loginRedirect' => array(
                    'controller' => 'ComplejosResidenciales',
                    'action' => 'index'
                ),
                'logOutRedirect' => array(
                    'controller' => 'Usuarios',
                    'action' => 'index'
                ),
                'fields' => array(
                    'username' => 'usuario',
                    'password' => 'clave'
                ),
                'authorize' => 'Controller'
            )
        )
    );
}

所以我决定不对密码字段进行散列,但仍无济于事。 我希望任何人都可以帮我一把,因为我是CakePHP的新手而且不知道如何解决它。

我认为它必须是Auth->login()方法的东西,因为我不遵循这里的约定,但我不知道如何配置所述方法。目前如下:

public function login() {
    if($this->request->is('post')) {
        if($this->Auth->login()) {
            return $this->Auth->redirectUrl($this->Auth->redirectUrl());    
        }
        else {
            $this->Session->setFlash(__('Las credenciales proporcionadas no son correctas'), 'default', array(), 'auth');   
        }

正如rrd指出的那样,我的$ components数组是错误的,所以我把它改为:

public $components = array(
'Session',
'Auth'=>array('loginRedirect'=>array('controller'=>'ComplejosResidenciales',     'action'=>'index'), 'logOutRedirect'=>array('controller'=>'Usuarios', 'action'=>'index'),     'loginAction'=>array('controller'=>'Usuarios', 'action'=>'login'),     'authenticate'=>array('Form'=>array('userModel'=>'Usuario',     'fields'=>array('username'=>'usuario', 'password'=>'clave')))));
根据cakephp.org

,哪个更好
  

不要在authenticate或Form元素中放置其他Auth配置键(如authError,loginAction等)。它们应与验证密钥处于同一级别。

但它没有用。

一直在努力,我无法掌握它,我希望有人能指出我做错了什么。在我的AppController中,我已经声明了组件和beforeFilter函数,如下所示:

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

public function beforeFilter(){
      $this->Auth->authenticate = array(
         AuthComponent::ALL => array('userModel' => 'Usuario', "fields" =>   array("username" => "usuario", "password" => "clave"), 'Form'));
}

然后我在UsuariosController中有登录功能(显然我猜),如下所示:

public function login() {
    if($this->request->is('post')) {
    if($this->Auth->login()) {
    return $this->Auth->redirectUrl($this->Auth->loginRedirect);    
    }
    else {
    $this->Session->setFlash(__('Las credenciales proporcionadas no son correctas'),     'default', array(), 'auth');   
    }
    }
    }

但我只是看到“Las credenciales proporcionadas no son correctas”的消息。我不知道我是否正在$this->Auth->login()部分中正确调用Auth组件的方法,因为显然我没有结果这样调用它,没有参数,但我尝试用参数{{1调用它因此,它与我在用户名和密码字段中写的内容无关,任何事情都会通过,当然这很糟糕。

现在我知道为什么编码$this->request->data会导致无限制访问:

  

在2.x $ this-> Auth->登录($ this-> request-> data)将使用所发布的任何数据记录用户,而在1.3 $ this-> Auth- >登录($ this-> data)会先尝试识别用户,但只有在成功时才会登录。

根据蛋糕手册。我似乎无法正确阅读有关此问题的任何文件。无论如何,我求求有人帮助我,因为我在这里匆忙。在阅读了一些其他文档之后,我想Auth组件应该正确处理所有内容,只要我提供正确的配置,所以我最终在AppController中进行$this->Auth->login($this->request->data)调用,如下所示:

beforeFilter()

然后,在我的“UsuariosController”中,我做了:

var $components = array('Auth', 'Session');

public function beforeFilter() {
$this->Auth->loginAction = array('controller'=>'Usuarios', 'action'=>'login');
$this->Auth->redirectLogin = array('controller'=>'ComplejosResidenciales',   'action'=>'add');
$this->Auth->authenticate = array('Form'=>array('userModel'=>'Usuario',     'fields'=>array('username'=>'usuario', 'password'=>'clave')));
}

我有登录和注销功能,非常简单,但它不起作用,它不会在登录时重定向我也不会让我访问任何其他控制器,它似乎什么都不做。请帮忙!

public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow('index', 'view', 'add', 'edit', 'delete');   
    }

1 个答案:

答案 0 :(得分:0)

你应该改变更多的东西。

$ components应该是这样的:

public $components = array(
            'Session',
            'Auth' => array(
                'authenticate' => array(
                    'Form' => array(
                        'fields' => array('username'=>'usuario', 'password'=>'clave')
                    )
                )
            )
    );

我不确定userModel,请查看手册。

比你应该实现isAuthorized

function isAuthorized($user){
if(in_array($this->action, array('view', 'edit')))
    return true;
return false;
}

您的案例不需要beforeFilter。

您的登录方法是这样的。

public function login() {
        if ($this->request->is('post')) {
            if ($this->Auth->login()) {
                return $this->redirect($this->Auth->redirectUrl());
            }
        else {
            $this->Session->setFlash(__('Username or password is incorrect'), 'default', array(), 'auth');
            }
        }
    }

同样,我建议您阅读上面提到的手册或书籍。它有一个免费的样本,我想你会得到主要的想法。