Laravel LDAP (Adldap2) Невозможно пройти аутентификацию, имя пользователя равно нулю для защиты-> попытки - PullRequest
0 голосов
/ 16 июня 2020

Доброе утро, все время вылетает сообщение «Необходимо указать имя пользователя». при попытке войти в мое приложение. Подключение к LDAP в порядке, syn c также, в моих пользователях базы данных / таблицы я вижу все имя пользователя с паролем. Но не могу войти под любым именем пользователя. Попытка dd ($ username) в LoginController, «guard () -> try» покажет мне «null». Спасибо за помощь!

Моя версия

Laravel Version: ^7.0
Adldap2-Laravel Version: ^6.1
PHP Version: ^7.2.5
LDAP Type: OpenLDAP

my .env

LDAP_HOSTS=ldap.forumsys.com
LDAP_BASE_DN=dc=example,dc=com
LDAP_USERNAME=cn=read-only-admin,dc=example,dc=com
LDAP_PASSWORD=password
LDAP_PASSWORD_SYNC=true

my ldap. php

<?php

return [

    'logging' => env('LDAP_LOGGING', false),

     'connections' => [

        'default' => [

                  'auto_connect' => env('LDAP_AUTO_CONNECT', true),

                  'connection' => Adldap\Connections\Ldap::class,

               'settings' => [

               'schema' => Adldap\Schemas\OpenLDAP::class, 

               'account_prefix' => env('LDAP_ACCOUNT_PREFIX', ''),

               'account_suffix' => env('LDAP_ACCOUNT_SUFFIX', ''),

              'hosts' => explode(' ', env('LDAP_HOSTS', 'corp-dc1.corp.acme.org corp-dc2.corp.acme.org')),

               'port' => env('LDAP_PORT', 389),

               'timeout' => env('LDAP_TIMEOUT', 5),

                'base_dn' => env('LDAP_BASE_DN', 'dc=corp,dc=acme,dc=org'),

                'username' => env('LDAP_USERNAME', 'username'),
                'password' => env('LDAP_PASSWORD', 'secret'),

                'follow_referrals' => false,

                'use_ssl' => env('LDAP_USE_SSL', false),
                'use_tls' => env('LDAP_USE_TLS', false),

            ],

        ],

    ],

];

my ldap_auth

<?php

return [

     'connection' => env('LDAP_CONNECTION', 'default'),

    'provider' => Adldap\Laravel\Auth\DatabaseUserProvider::class,

    'model' => App\User::class,

    'rules' => [

        // Denys deleted users from authenticating.

        Adldap\Laravel\Validation\Rules\DenyTrashed::class,

        // Allows only manually imported users to authenticate.

        // Adldap\Laravel\Validation\Rules\OnlyImported::class,

    ],

    'scopes' => [

        // Only allows users with a user principal name to authenticate.
        // Suitable when using ActiveDirectory.
        // Adldap\Laravel\Scopes\UpnScope::class,

        // Only allows users with a uid to authenticate.
        // Suitable when using OpenLDAP.
        // Adldap\Laravel\Scopes\UidScope::class,

    ],

    'identifiers' => [

        'ldap' => [

            'locate_users_by' => 'uid',

            'bind_users_by' => 'distinguishedname',

        ],

        'database' => [

         'guid_column' => 'objectguid',

            'username_column' => 'username', //'email',

        ],

        'windows' => [

            'locate_users_by' => 'samaccountname',

            'server_key' => 'AUTH_USER',

        ],

    ],

    'passwords' => [

        'sync' => env('LDAP_PASSWORD_SYNC', false),

        'column' => 'password',

    ],

    'login_fallback' => env('LDAP_LOGIN_FALLBACK', false),

    'sync_attributes' => [

        //'email' => 'userprincipalname',

        'username' => 'uid', 

        'name' => 'cn',

    ],

    'logging' => [

        'enabled' => env('LDAP_LOGGING', true),

        'events' => [

            \Adldap\Laravel\Events\Importing::class                 => \Adldap\Laravel\Listeners\LogImport::class,
            \Adldap\Laravel\Events\Synchronized::class              => \Adldap\Laravel\Listeners\LogSynchronized::class,
            \Adldap\Laravel\Events\Synchronizing::class             => \Adldap\Laravel\Listeners\LogSynchronizing::class,
            \Adldap\Laravel\Events\Authenticated::class             => \Adldap\Laravel\Listeners\LogAuthenticated::class,
            \Adldap\Laravel\Events\Authenticating::class            => \Adldap\Laravel\Listeners\LogAuthentication::class,
            \Adldap\Laravel\Events\AuthenticationFailed::class      => \Adldap\Laravel\Listeners\LogAuthenticationFailure::class,
            \Adldap\Laravel\Events\AuthenticationRejected::class    => \Adldap\Laravel\Listeners\LogAuthenticationRejection::class,
            \Adldap\Laravel\Events\AuthenticationSuccessful::class  => \Adldap\Laravel\Listeners\LogAuthenticationSuccess::class,
            \Adldap\Laravel\Events\DiscoveredWithCredentials::class => \Adldap\Laravel\Listeners\LogDiscovery::class,
            \Adldap\Laravel\Events\AuthenticatedWithWindows::class  => \Adldap\Laravel\Listeners\LogWindowsAuth::class,
            \Adldap\Laravel\Events\AuthenticatedModelTrashed::class => \Adldap\Laravel\Listeners\LogTrashedModel::class,

        ],
    ],

];

мой loginController

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = RouteServiceProvider::HOME;

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest')->except('logout');
    }

    public function username()
    {
        return 'username';
    }
}

Ответы [ 2 ]

0 голосов
/ 29 июля 2020

Я знаю, что это старый вопрос, но я все еще сталкивался с этой проблемой даже в 2020 году, и это заняло у меня много времени. На самом деле проблема очень глупая, если вы также пытаетесь связать сервер OpenLDAP с вашим приложением Laravel с помощью пакета Adldap2-Laravel. Adldap2-Laravel по умолчанию настроен для Microsoft Active Directory. Но для OpenLDAP нам нужно правильно изменить массив Identifiers следующим образом:

<?php

return [

     // configurations settings...

    'identifiers' => [

        'ldap' => [

            'locate_users_by' => 'uid', // changed from userprincipalname

            'bind_users_by' => 'dn', // changed from distinguishedname

        ],

        'database' => [

         'guid_column' => 'objectguid',

            'username_column' => 'username', //'email',

        ],

        'windows' => [

            'locate_users_by' => 'samaccountname',

            'server_key' => 'AUTH_USER',

        ],

    ],

    // rest of the configurations...

];

Скажите мне, если мой ответ непонятен для новичков, поскольку я тоже новичок ie. Попробую подробнее объяснить решение :)

0 голосов
/ 16 июня 2020

Я сам прошел через эту боль.

Похоже, вы подключаетесь к LDAP с помощью своей учетной записи службы, но я не вижу, где вы регистрируете аутентифицированного пользователя в Laravel. Ваши пользователи должны где-нибудь указывать имя пользователя и пароль на экране? Если нет, то как захватить пользователя и войти в систему на Laravel?

То, как я делал это на предприятиях, которым приходилось go через LDAP, должно было иметь обычную страницу входа Laravel. , но средний метод в контроллере входа , который отправляет сообщение в LDAP через учетную запись службы с PW. Если это удалось, войдите в систему стандартным способом Laravel. В основном просто проверьте PW по LDAP, а затем войдите в систему, а не по Laravel DB.

Пример кода - он может сильно различаться, но может дать вам представление о том, что может сработать:

  if(env('LOGIN', false) === 'LDAP'){
        $ldap = new \App\Http\Controllers\ClientSpecific\BaseLDAPController();
        $username = $request->input('username');
        if($ldap->authenticate($username, $request->input('password'))){
            return $this->sendLoginResponse($request);
        }
    }else {
        if ($this->guard()->attempt($credentials, $request->has('remember'))) {
            return $this->sendLoginResponse($request);
        }
    }
...