Проблема с аутентификацией CakePHP 3 Ldap и разъяснения

Я работаю над интеграцией аутентификации LDAP в свой проект. и я следовал руководству с официального сайта CakePHP, в котором рассказывается, как создать настраиваемый объект в пути src приложения и использовать эти настраиваемые объекты в AuthController.

Поэтому я создал папку Auth в src с именем файла LdapAuthorize.php. Путь выглядит так: src / Auth / LdapAuthorize.php

Вот мой код LdapAuthorize.php:

namespace App\Auth;

use Cake\Auth\BaseAuthorize;
use Cake\Network\Request;

class LdapAuthorize extends BaseAuthorize {
    public function authorize($user, Request $request) {
        if ($user == 'username') { // where username is logged on ldap user on a computer.
            return true;
        }
    }
}

Я также вызвал объект в файле AppController.php. Вот мой код:

public function initialize()
{
    parent::initialize();
    $this->loadComponent('Flash');
    $this->loadComponent('Auth', [
        'loginRedirect' => [
            'controller' => 'Customers',
            'action' => 'index'
        ],
        'logoutRedirect' => [
            'controller' => 'Pages',
            'action' => 'display',
            'home'
        ]
    ]);      
    $this->Auth->config('authenticate', [
        'Ldap'
    ]);
}

Поэтому, когда я получаю доступ к URL-адресу http://localhost/AppPath/Dashboard/index, я получаю Authentication adapter "Ldap" was not found.

Поскольку это мой первый опыт работы с CakePHP, я не мог найти в Интернете столько решений, которые помогли бы устранить какие-либо проблемы.

Добавление дополнительного кода для LdapAuthenticate.php:

namespace App\Auth;

use Cake\Auth\BaseAuthenticate;
use Cake\Network\Request;
use Cake\Network\Response;

class OpenidAuthenticate extends BaseAuthenticate
{
    public function authenticate(Request $request, Response $response)
    {
        $users = ["john", "ray"];
        return $users;
    }
}

person Ray    schedule 15.09.2015    source источник


Ответы (2)


Вам нужен настраиваемый адаптер аутентификации, ваш LdapAuthorize является настраиваемым авторизовать адаптер:

// in src/Auth/LdapAuthenticate.php

namespace App\Auth;

use Cake\Auth\BaseAuthenticate;
use Cake\Network\Request;
use Cake\Network\Response;

class LdapAuthenticate extends BaseAuthenticate {

    protected $_host = 'your_ldap_server' ;

    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 = "your ldap query... "
        $dn = "uid=$username, ".$basedn;
        $ldapbind = @ldap_bind($ds, $dn, $password);
        if (!$ldapbind) {
            return false ;
        }
        // Do whatever you want with your LDAP connection... 
        $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) ;
        ldap_close ($ldapbind);
        return $user ;
    }

}
person Holt    schedule 16.09.2015
comment
Понятно. Я также добавил в свой проект настраиваемый адаптер аутентификации, в котором я создал массив со списком возвращаемых пользователей. У меня все еще Authentication adapter "Ldap" was not found., поэтому я тоже попробовал $this->Auth->config('authenticate', ['App\Auth\Ldap' ]); Не уверен, что еще мне не хватает. - person Ray; 16.09.2015
comment
@Ray Вы создали файл src/Auth/LdapAuthenticate.php с кодом из моего ответа? Я не знаю, работает ли App\Auth\Ldap для варианта authenticate, попробуйте с простым Ldap. Я не понимаю, что вы имеете в виду, говоря, что я создал массив со списком возвращаемых пользователей? Если у вас есть что-то еще в вашем проекте, добавьте это в свой вопрос с подробностями. - person Holt; 16.09.2015
comment
Да, я создал файл в src/Auth/LdapAuthenticate.php с указанным выше кодом. Я включаю это в свой вопрос, который я разместил ранее. В LdapAuthenticate я создал массив с пользователями, которым разрешено входить в систему, чтобы у меня мог работать начальный компонент, прежде чем я начну писать связанный с LDAP PHP-код для подключения к каталогу Activie. Нужно ли мне также вносить какие-либо изменения в маршрутизацию? - person Ray; 16.09.2015
comment
@Ray Вы назвали свой класс OpenidAuthenticate вместо LdapAuthenticate, если это не ошибка копирования / вставки, вероятно, это и является причиной вашей ошибки. Также обратите внимание, что authenticate должен возвращать только одного пользователя, а не список пользователей (да, документ немного вводит в заблуждение по этому поводу ...). - person Holt; 16.09.2015
comment
Большое спасибо за разъяснение пути адаптера LdapAuthenticate. Официальный документ немного сбивает меня с толку, и я с трудом понимаю, как прикрепить аутентификацию LDAP на каждой странице. Я могу открыть новый вопрос и сделать его решенным. - person Ray; 16.09.2015

У меня все еще была такая же ошибка после создания настраиваемого адаптера аутентификации, предложенного выше.

Я решил это изменить
namespace App\Auth;

для

namespace Cake\Auth;

В LdapAuthenticate.php

person Matias    schedule 02.12.2015