Intereting Posts
Как найти отсутствующие значения в последовательности с PHP? подсчитать количество строк в mysql? Выполнить команду оболочки через ssh с помощью PHP извлекать значения в массиве и создавать переменную php Как извлечь последовательность чисел из массива? Определите часовой пояс из широты / долготы без использования веб-сервисов, таких как Geonames.org Почему мы должны включать кавычку при вставке строковой переменной в базу данных mysql php Как отображать php-код и html-теги в виде текста на веб-странице Magento Получить текущий Сортировка и Направление с помощью getCollection () Попытка «вызвать» хранимые процедуры с помощью CodeIgniter Как получить вложенный список HTML из набора записей массива объектов? Codeigniter на Ubuntu нет приветственного сообщения drupal разделяет заголовок и нижний колонтитул кода шаблона как получить название категории текущего продукта (на странице сведений о продукте) в magento Нужно писать XML с помощью PHP – как?

CakePhp Auth: Вопросы

Я должен сделать аутентификацию cakePhp, и я хочу использовать компонент «Auth». Я пытаюсь понять, заполняет ли это мое требование:

Большое спасибо за Вашу помощь

Короткий ответ: да, вы можете делать все это, но мне кажется, что ACL может быть излишним для ваших нужд (но я также стараюсь избегать ACL, если есть какое-либо открытие). К вашим пунктам:

  • Как предполагает Иво, для аутентификации несколькими полями вам понадобится пользовательский UsersController::login() (если ваша модель auth не является User , а затем используйте соответствующий контроллер). Если метод входа компонента Auth не работает, он передает управление вашему пользовательскому методу login() . Вот фрагмент проекта, над которым я работал:

     function login() { # Allow login by either username (legacy) or email. # If no authenticated user exists at this point then the Auth # component's login() method has failed and control has been passed # here for any further handling. Since the expected credentials # (email and password) have failed we're going to check for # username and password. $user = $this->Auth->user(); if( empty( $user ) && !empty( $this->Auth->data['User']['email'] ) && !empty( $this->Auth->data['User']['password'] ) ) { $user = $this->User->find( 'first', array( 'recursive' => -1, 'conditions' => array( 'User.username' => $this->Auth->data['User']['email'], 'User.password' => $this->Auth->data['User']['password'], ) ) ); if( empty( $user ) || !$this->Auth->login( $user ) ) { # Set the configured flash message b/c login failed after both checks. $this->Session->setFlash( $this->Auth->loginError, null, array(), 'auth' ); } } $this->redirect( $this->Auth->redirect(), null, true ); } 
  • Для доступа к действию просто используйте $this->Auth->allow() и $this->Auth->deny() в каждом beforeFilter() соответствующего beforeFilter() соответствующего соответствующего контроллера. Например, в UsersController вы можете сделать что-то вроде этого:

     public function beforeFilter() { parent::beforeFilter(); $this->Auth->deny('*'); $this->Auth->allow( 'login', 'logout' ); } 
  • В представлениях просто определите, аутентифицирован ли пользователь, проверяя значение Auth.User чтобы определить, что отображать / скрывать от анонимного / аутентифицированного:

     if( $this->Session->check( 'Auth.User' ) ) { ... } 
  • Если пароль изменяется, вы можете повторно аутентифицировать пользователя прозрачно, вызывая $this->Auth->login( $user_data ) . Я делаю это, например, когда пользователь регистрируется. Я не хочу, чтобы он / она должен был войти в систему, поэтому я просто заходил в систему автоматически.

С помощью Auth вам необходимо иметь ровно 2 поля (которые вы можете указать) для аутентификации. Одно поле (пароль) будет хешировано. Да, все уровни доступа, которые вы хотите, можно указать в Auth: http://book.cakephp.org/view/1251/Setting-Auth-Component-Variables

Вам придется управлять сменой пароля, но пользователи не будут выходить из системы, если они меняют пароль.

Иногда мне нужно, чтобы только часть представления не отображалась (например, элемент входа не отображается)

ВТ?

Создайте пользовательский login (), который пытается аутентифицироваться с помощью любого из методов. Вы также можете настроить переменную Authenticate для пользовательского входа.

Вы можете указать в разных контроллерах, какие части Auth должны разрешать аутентифицированным пользователям. См. Методы Auth .

Вы также можете использовать ACL (см. Полный учебник ACL Cake и т. Д.) Для управления гранулярными разрешениями.

Иногда мне нужно, чтобы не отображалась только часть представления

Создайте элемент, который проверяет Auth-> user (), чтобы выбрать, какой контент отображать.

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

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

Что касается ваших уровней доступа, я бы использовал ACL, который мог бы управлять доступом к действиям всех контроллеров. После настройки вам придется вручную установить разрешения для каждого действия, используя один из плагинов, написанных сообществом или вручную.

Если вы хотите отключить часть своих просмотров, вам нужно будет прочитать разрешения для проверки уровня доступа пользователя оттуда. Хорошо бы сохранить разрешения в файле кеша или в сеансе, когда пользователь входит в систему, чтобы сделать его доступным в представлении. Затем напишите ваши тесты и повторите то, что нужно.

(Я использую CakePHP 2.0, я не знаю, как легко вы можете расширить AuthComponent в 1.3, если вы его используете)

Для части Разрешить и Запретить можно легко сделать с помощью компонента Auth.

использовать что-то вроде

 $this->allow('*'); // to allow every thing $this->deny('*'); // to deny every thing $this->allow('login', 'signup'); // allows login and sign up without being logged in $this->deny('profile', 'password'); // need to be logged into to access profile and password and rest of the actions are allowed. 

Для смены пароля вы можете сохранить измененный пароль в базу данных и принудительно вывести пользователя из системы и перенаправить его на логин снова

 $this->Auth->logout(); this forces the user to logout of cakephp Auth 

Для первого вопроса – loggin при использовании электронной почты или идентификатора клиента напрямую невозможен с использованием компонента cakephp Auth, поскольку вам нужно будет определить, в частности, какие из них действуют как имя пользователя.

Альтернативное решение – вы можете просто скопировать компонент Auth в свое приложение / контроллер / компонент и взломать код. Когда вы получаете имя пользователя, вы можете протестировать его по электронной почте и идентификатору клиента и поддерживать поток.

Надеюсь это поможет