使用没有管理员连接的LDAP在Laravel中进行身份验证/登录?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用没有管理员连接的LDAP在Laravel中进行身份验证/登录?相关的知识,希望对你有一定的参考价值。

我试图让Laravel 5.4使用LDAP而不是传统的数据库方法对用户进行身份验证。

有一个图书馆,Adldap2/Adldap2-Laravel。问题是这个库:

  1. 首先以管理员用户身份连接LDAP服务器
  2. 然后搜索想要登录我的应用程序的用户
  3. 检查密码是否正确
  4. 将与该用户关联的数据存储在“本地”Laravel数据库中
  5. 以admin用户身份重新连接到LDAP

这在我的情况下不起作用,因为LDAP服务器中没有管理员,我不得不连接到;只允许用户名使用该应用程序,没有任何角色。

正如在already existing issue中看到的那样,我使用以下代码修改了LoginController类(出于测试目的,我正在尝试连接到此网页中提供的服务器:Online LDAP Test Server)。

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' => AdldapLaravelAuthDatabaseUserProvider::class,
    'resolver' => AdldapLaravelAuthResolver::class,
    'importer' => AdldapLaravelAuthImporter::class,
    'rules' => [
        AdldapLaravelValidationRulesDenyTrashed::class,
        // AdldapLaravelValidationRulesOnlyImported::class,
    ],
    'scopes' => [
        AdldapLaravelScopesUpnScope::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' => AdldapConnectionsLdap::class,
            'schema' => AdldapSchemasActiveDirectory::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,
            ],
        ],
    ],
]
答案

如果有人偶然发现这个问题,我找到了实现我想要的方法。分步指南在这里:Howto: adminless LDAP authentification in Laravel

基本上,在true返回LoginController::attemptLogin()之前,Guard必须用于在数据库中保存AppUser

以上是关于使用没有管理员连接的LDAP在Laravel中进行身份验证/登录?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 DAO 的情况下使用 Spring LDAP 连接到多个 url?

带有 SpringSecurity、本地用户和 LDAP 的 Grails

Spring-Ldap连接Ldap及简单的增删查改

如何使用C#在LDAP中进行身份验证

存储 LDAP 连接并在会话中绑定

没有管理器的 Grails Spring Security Ldap