Разъяснения по поводу Auth в CakePHP 1.2

November 26, 2008 | By admin | Filed in: CakePHP, Переводы.

Это, по сути, продолжение статьи про быстрое создание приложения на Cake PHP. Оригинал – здесь.

Снова взглянем на app_controller.php:


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

function beforeFilter() {
$this->Auth->allow('display');
$this->Auth->loginRedirect = array('controller'=>'users', 'action'=>'index');
}
}

$this->Auth->allow('display'); указывает компоненту Auth, что нужно разрешить действие  ‘display’. Данное действие является частью PagesController, который является частью ядра кейкпхп. Основная задача этого контроллера – управление статическими страницами. Чтобы узнать, как он работает, можете посмотреть API , но запомните, что действие ‘display’, как несложно догадаться, отвечает за отображение страниц. Если по умолчанию его не разрешить, Auth закроет доступ к домашней странице или странице “О нас”, например. Во многих случаях это совсем ни к чему.

В строке $this->Auth->loginRedirect = array('controller'=>'users', 'action'=>'index'); мы указываем, куда должен быть перенаправлен пользователь после успешного входа в систему. По умолчанию переход производится на главную страницу (корень) сайта.

Далее, UsersController:


if($this->action == 'add') {
$this->Auth->authenticate = $this->User;
}

$this->Auth->authenticate = $this->User; говорит Auth-компоненту, что нужно использовать модель User для замены стандартного метода hashPasswords(). Другими словами, если в $this->User есть метод hashPasswords(), то он будет использован вместо стандартного hashPasswords() компонента Auth. В данном случае, замена производится только для действия ‘add’.

Для чего это нужно?

Как вы могли заметить, по умолчанию Auth хеширует пароли перед валидацией.  Это создает определенные проблемы. Во-первых, вы не сможете использовать правила ‘minLength’ и ‘notEmpty’ должным образом, т.к. функция проверки получит на вход уже хешированное значение (которое всегда длинное и не пустое) вместо введенного пользователем. Во-вторых, если при заполнении формы (при сохранении данных) возникнут ошибки, хеш появится в поле для ввода пароля.

Путем использования собственного метода в модели User все эти проблемы могут быть решены:


function hashPasswords($data, $enforce=false) {
if($enforce && isset($this->data[$this->alias]['password'])) {
if(!empty($this->data[$this->alias]['password'])) {
$this->data[$this->alias]['password'] = Security::hash($this->data[$this->alias]['password'], null, true);
}
}

return $data;
}

function beforeSave() {
$this->hashPasswords(null, true);

return true;
}

Какие это дает преимущества:

  • При создании представления мне не надо беспокоиться о том, как название поля формы повлияет на модель или контроллер
  • Можно использовать поле с названием ‘password’ (а не менять его на что-то вроде ‘passwd’) для валидации
  • Лично я не сторонник очистки поля “пароль” в случае ошибки в данных формы. Незачем создавать лишние проблемы пользователю, который ошибся в поле ‘email’, заставляя его вводить пароль заново
  • Не нужно писать лишний код в контроллере для переприсваивания/сброса значения виртуальных полей для пароля

Что касается приведенного выше кода – hashPasswords() не будет хешировать пароль, если не установлен флаг $enforce (а ему присваивается значение true в beforeSave()).

Надеюсь, что разъяснил, что к чему, и теперь вы можете пробовать работать с Auth и дальше…


Leave a Reply