Я новичок в Cakephp и теперь работаю над реализацией LDAP-аутентификации в своем приложении. Многие вещи в учебнике «закладок» на официальном веб-сайте работают автоматически, поэтому он не дал мне достаточной информации о том, как реализовать определенную проверку подлинности. Я уже проверял эту проблему и разъяснения для проверки подлинности CakePHP 3 Ldap и пытался реализовать мою аутентификацию таким образом, но все же имею некоторые проблемы с пониманием.
В моей базе данных у меня есть таблица «Студенты», которая имеет атрибут «id» в качестве первичного ключа. Мой AppController выглядит следующим образом:
public function initialize() { parent::initialize(); $this->loadComponent('Flash'); $this->loadComponent('Auth', ['authenticate' => ['Form' => ['fields' => ['username' => 'email', 'password' => 'password'] ] ], 'loginAction' => [ 'controller' => 'Students', 'action' => 'login' ] ]); $this->Auth->config('authenticate', ['Ldap']); } public function isAuthorized() { if($this->Auth->user('departmentnumber') == "***") { return true; } }
Класс LdapAuthenticate похож на сообщение, упомянутое выше:
namespace App\Auth; use Cake\Auth\BaseAuthenticate; use Cake\Network\Request; use Cake\Network\Response; class LdapAuthenticate extends BaseAuthenticate { protected $_host = '***' ; public function authenticate(Request $request, Response $response) { $username = $request->data['username'] ; $password = $request->data['password'] ; $ds = @ldap_connect($this->_host) ; if (!$ds) { throw \Cake\Error\FatalErrorException ('Unable to connect to LDAP host.') ; } $basedn = "cn=Users,dc=***"; $dn = "cn=$username, " . $basedn; $ldapbind = @ldap_bind($ds, $dn, $password); if (!$ldapbind) { return false ; } $entry = ldap_first_entry ($ldapbind) ; $attrs = ldap_get_attributes ($ldapbind, $entry) ; $user = [] ; // Loop for ($i = 0 ; $i < $attrs["count"] ; $i++) { $user[$attrs[$i]] = ldap_values ($ldapbind, $entry, $attrs[$i])[0] ; } // Then close it and return the authenticated user ldap_unbind ($ldapbind) ; return $user ; } }
В StudentsController я реализовал функции входа и выхода из системы, как в учебнике «bookmarker»:
public function login(){ if ($this->request->is('post')){ $user = $this->Auth->identify(); if ($user) { $this->Auth->setUser($user); return $this->redirect($this->Auth->redirectUrl()); } // user is not identified $this->Flash->error('Your username or password is not correct'); } } public function logout(){ $this->Flash->success('You are now logged out'); return $this->redirect($this->Auth->logout()); }
Когда я открываю любую страницу, я успешно прихожу на мою страницу login.ctp. После ввода моих учетных данных и нажатия «login» у меня появляется ошибка «SQLSTATE [42S02]: базовая таблица или представление не найдены: 1146 Таблица« *** _ db.users »не существует». Поэтому я думаю, что я сделал что-то неправильно, но у меня недостаточно понимания, чтобы найти, где – не знаю, почему он пытается найти таблицу «пользователей» в моей базе данных, которая не существует.
Спасибо всем, кто помогает мне с идеями заранее!
Из-за неправильной настройки. Вместо использования Form
в вашем конфигурационном Ldap
Auth используйте Ldap
:
$this->loadComponent('Auth', ['authenticate' => ['Ldap' => ['fields' => ['username' => 'email', 'password' => 'password'] ] ], 'loginAction' => [ 'controller' => 'Students', 'action' => 'login' ] ]);