2015-11-15 3 views
0

Я новичок в CakePHP и теперь работаю над реализацией LDAP-аутентификации в своем приложении. Многие вещи в учебнике «закладок» на официальном веб-сайте работают автоматически, поэтому он не дал мне достаточной информации о том, как реализовать определенную проверку подлинности. Я уже проверил этот пост CakePHP 3 Ldap authentication issue and clarification и попытался реализовать мою аутентификацию таким образом, но все еще имею некоторые проблемы с пониманием.Аутентификация LDAP с помощью Cakephp 3.x

В моей базе данных У меня есть таблица «Студенты», которая имеет атрибут «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 »не существует». Итак, я думаю, что я сделал что-то не так, но у меня недостаточно понимания, чтобы найти, где - не знаю, почему он пытается найти таблицу «пользователей» в моей базе данных, которая не существует.

Спасибо всем, кто помогает мне с идеями заранее!

ответ

0

Из-за неправильной конфигурации. Вместо использования Form в вашей конфигурации Auth используйте Ldap:

$this->loadComponent('Auth', ['authenticate' => 
     ['Ldap' => 
      ['fields' => 
       ['username' => 'email', 
        'password' => 'password'] 
      ] 
     ], 'loginAction' => [ 
     'controller' => 'Students', 
     'action' => 'login' 
    ] 
    ]); 
Смежные вопросы