簡體   English   中英

使用 LDAP 在 Laravel 中進行身份驗證/登錄而無需管理員連接?

[英]Authentication/login in Laravel using LDAP with no admin connection?

我試圖讓 Laravel 5.4 使用 LDAP 而不是傳統的數據庫方法對用戶進行身份驗證。

已經有一個庫, Adldap2/Adldap2-Laravel 問題是這個庫:

  1. 首先以管理員用戶身份連接 LDAP 服務器
  2. 然后搜索想要登錄我的應用程序的用戶
  3. 檢查密碼是否正確
  4. 將與該用戶關聯的數據存儲在“本地”Laravel 數據庫中
  5. 以管理員用戶身份重新連接到 LDAP

這在我的情況下不起作用,因為我 ̶w̶a̶n̶t̶ 必須連接到 LDAP 服務器中沒有管理員; 只允許使用該應用程序的用戶名,沒有角色。

正如在一個已經存在的問題中所見,我使用以下代碼修改了LoginController類(出於測試目的,我試圖連接到此網頁中提供的服務器: 在線 LDAP 測試服務器)。

protected function attemptLogin(Request $request) {
    $conn_settings = config('adldap.connections')[config('adldap_auth.connection')]['connection_settings'];
    $credentials = $request->only(config('adldap_auth.usernames.eloquent'), 'password');

    $user_format = env('ADLDAP_USER_FORMAT', 'uid=%s,' . $conn_settings['base_dn']);
    $userdn = sprintf($user_format, $credentials[config('adldap_auth.usernames.eloquent')]);
    $pass = $credentials['password'];

    if(Adldap::auth()->attempt($userdn, $pass, $bindAsUser = true)) {
        return true;
    }

    return false;
}

我現在遇到的問題是,一旦使用正確的憑據登錄,我就會被送回登錄表單。 當憑據錯誤時,我會收到相應的錯誤消息。

我的配置文件,以防萬一:

.env:

ADLDAP_CONTROLLERS=ldap.forumsys.com 
ADLDAP_BASEDN=dc=example,dc=com
ADLDAP_USER_FORMAT=uid=%s,dc=example,dc=com

adldap_auth.php:

[
    'connection' => env('ADLDAP_CONNECTION', 'default'),
    'provider' => Adldap\Laravel\Auth\DatabaseUserProvider::class,
    'resolver' => Adldap\Laravel\Auth\Resolver::class,
    'importer' => Adldap\Laravel\Auth\Importer::class,
    'rules' => [
        Adldap\Laravel\Validation\Rules\DenyTrashed::class,
        // Adldap\Laravel\Validation\Rules\OnlyImported::class,
    ],
    'scopes' => [
        Adldap\Laravel\Scopes\UpnScope::class,
    ],
    'usernames' => [
        'ldap' => 'uid',
        'eloquent' => 'username',
    ],
    'login_fallback' => env('ADLDAP_LOGIN_FALLBACK', false),
    'password_sync' => env('ADLDAP_PASSWORD_SYNC', true),
    'windows_auth_attribute' => ['samaccountname' => 'AUTH_USER'],
    'sync_attributes' => [
        'username' => 'uid',
        'name' => 'cn',
    ],
];

adldap.php:

return [
    'connections' => [
        'default' => [
            'auto_connect' => false,
            'connection' => Adldap\Connections\Ldap::class,
            'schema' => Adldap\Schemas\ActiveDirectory::class,
            'connection_settings' => [
                'account_prefix' => env('ADLDAP_ACCOUNT_PREFIX', ''),
                'account_suffix' => env('ADLDAP_ACCOUNT_SUFFIX', ''),
                'domain_controllers' => explode(' ', env('ADLDAP_CONTROLLERS', 'corp-dc1.corp.acme.org corp-dc2.corp.acme.org')),
                'port' => env('ADLDAP_PORT', 389),
                'timeout' => env('ADLDAP_TIMEOUT', 5),
                'base_dn' => env('ADLDAP_BASEDN', 'dc=corp,dc=acme,dc=org'),
                'admin_account_suffix' => env('ADLDAP_ADMIN_ACCOUNT_SUFFIX', ''),
                'admin_username' => env('ADLDAP_ADMIN_USERNAME', ''),
                'admin_password' => env('ADLDAP_ADMIN_PASSWORD', ''),
                'follow_referrals' => true,
                'use_ssl' => false,
                'use_tls' => false,
            ],
        ],
    ],
]

萬一有人偶然發現這個問題,我找到了一種方法來實現我想要的。 分步指南在這里:如何:Laravel 中的無管理員 LDAP 身份驗證

基本上,在LoginController::attemptLogin()返回true之前,必須使用GuardApp\\User保存在數據庫中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM