Я должен сделать аутентификацию cakePhp, и я хочу использовать компонент «Auth». Я пытаюсь понять, заполняет ли это мое требование:
Мне нужно аутентифицировать пользователей с их электронной почтой или их customerId (с добавлением пароля, конечно). Я не могу найти, возможно ли иметь два поля (или более), на которых может быть выполнена аутентификация
У меня есть несколько частей, на которых мне нужно пройти аутентификацию. Но мне нужна разная гранулярность:
Большое спасибо за Вашу помощь
Короткий ответ: да, вы можете делать все это, но мне кажется, что 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 в свое приложение / контроллер / компонент и взломать код. Когда вы получаете имя пользователя, вы можете протестировать его по электронной почте и идентификатору клиента и поддерживать поток.
Надеюсь это поможет