CakePhp Auth: Вопросы - PullRequest
       2

CakePhp Auth: Вопросы

0 голосов
/ 02 сентября 2011

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

  • Мне нужно аутентифицировать пользователей по их электронной почте или по их идентификатору клиента (конечно, с дополнительным паролем).Я не могу найти, возможно ли иметь два поля (или больше), по которым может быть выполнена аутентификация

  • У меня есть несколько частей, по которым мне нужно пройти аутентификацию.Но мне нужна разная гранулярность:

    • Для некоторых вещей это целый контроллер, который не должен быть доступен (если это возможно, за исключением (например, все контроллеры "User", кроме действия входа в систему / регистрации) дляДругой мне действительно нужно, чтобы это был весь контроллер (например, контроллер корзины)
    • Иногда мне нужно, чтобы только некоторые действия были недоступны без регистрации
    • Иногда мне нужно, чтобы только часть представления былане отображается (например, элемент входа в систему не отображается)
  • Управляет ли компонент действием, таким как смена пароля? Потому что, если пользователь меняет свой пароль, мне нужно, чтобы он не отключился.

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

Ответы [ 5 ]

2 голосов
/ 02 сентября 2011

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

  • Как предполагает Ivo, вам потребуется пользовательский метод UsersController::login() для аутентификации по нескольким полям (если ваша модель аутентификации не 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() каждого соответствующего контроллера. Например, в 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 ). Я делаю это, например, когда пользователь регистрируется. Я не хочу, чтобы ему / ей приходилось входить в систему, поэтому я просто авторизируюсь автоматически.

1 голос
/ 02 сентября 2011

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

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

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

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

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

0 голосов
/ 02 сентября 2011

Для частей «Разрешить» и «Запретить» можно легко выполнить с помощью компонента 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

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

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

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

0 голосов
/ 02 сентября 2011

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

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

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

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

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

0 голосов
/ 02 сентября 2011

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

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

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

ВТУ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...