2014-02-08 2 views
0

Я думаю, это глупый вопрос, но у меня возникают проблемы с входом в разделы с ограниченным доступом на сайте, который я создаю в Cake.Не могу войти с использованием AuthComponent в Cake php

Для начала я вижу, что строка пароля в $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 заостренные, мой массив $ компоненты неправильно, поэтому я изменил его:

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

Не устанавливайте другие ключи конфигурации Auth (например, authError, loginAction и т. Д.) В элементе аутентификации или элемента Form. Они должны быть на том же уровне, что и ключ аутентификации.

Но он не работает.

Борясь с этим, и я не могу его повесить, я хочу, чтобы кто-то указывал, что я делаю неправильно. В моей 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». Я не знаю, правильно ли я вызываю метод компонента Auth в части $this->Auth->login(), потому что, по-видимому, у меня нет результата при вызове такого типа без аргументов, но я попробовал называть его аргументом $this->request->data и, как результат, Не важно, что я написал в полях имени пользователя и пароля, все пройдет, что плохо, конечно.

Теперь я понимаю, почему кодирование $this->Auth->login($this->request->data) в результате дает неограниченный доступ:

В 2.x $ this-> Auth-> логин ($ this-> request-> данные) зарегистрирует пользователя в с независимо от того, какие данные отправлены, тогда как в 1.3 $ this-> Auth-> login ($ this-> data) будет пытаться сначала идентифицировать пользователя и только войти в систему при успешном завершении.

Согласно руководству по тортам. Кажется, я не могу правильно прочитать какой-либо документ об этом. Во всяком случае, я прошу кого-нибудь помочь мне, потому что я спешу сюда.После прочтения некоторых других документов, я думаю, что Auth компонент должен корректно обрабатывать все, до тех пор, как я обеспечить правильную конфигурацию, так что я в конечном итоге делает beforeFilter() вызов в AppController, как это:

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

Тогда, в моем «UsuariosController» Я:

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

и у меня есть для входа и выхода из функции, очень просто, но это не работает, и это не перенаправляет меня на вход в системе и не позволяет мне получить доступ к любому другому контроллеру , он ничего не делает. Пожалуйста помоги!

/** 
* login and logout functions 
* 
*/ 

    public function login() { 
    } 
    public function logout() { 
    $this->redirect($this->Auth->logout()); 
    } 
+0

Для этого вам следует четко указать основные принципы Auth. Прочтите руководство или книгу, например https://leanpub.com/CakePHPUserAuthentication Ваше объявление массива Auth неверно. Какую версию CakePHP вы используете? – rrd

+0

@rrd Я использую торт 2.4.5, но я не понимаю, что не так с моим объявлением компонента, я действительно не разработал большую часть авторизации, но на данный момент я просто пытаюсь ограничить все контроллеры и разрешать их по мере необходимости в части beforeFilter каждого –

ответ

0

Вы должны изменить больше вещей.

$ компоненты должны быть что-то вроде этого:

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

Опять же, я рекомендую вам ознакомиться с руководством или книгой, упомянутой выше. У него есть бесплатный образец, я думаю, вы получите основную идею.

Смежные вопросы