Symfony身份验证提供程序

mmm*_*mmm 8 php authentication ldap symfony

我正在使用fr3d/ldap-bundle.如果它们不在db中,它会将我登录并从AD导入用户.没关系.

尽管AD用户我也有本地用户,这些用户都在我的数据库中.有一个特殊的列authType说明了如何通过LDAP或本机(FOS)对用户进行身份验证.我创建了自己的用户提供程序:

public function chooseProviderForUsername($username)
{
    if($user->getAuthType() == User::LOGIN_LDAP) {
         $this->properProvider = $this->ldapUserProvider;
     } elseif($user->getAuthType() == User::LOGIN_NATIVE) {
         $this->properProvider = $this->fosUserProvider;
     } else {
         throw new InvalidArgumentException('Error');
     }
}

public function loadUserByUsername($username)
{
    return $this->chooseProviderForUsername($username)->loadUserByUsername($username);
}
Run Code Online (Sandbox Code Playgroud)

问题:链提供商不是一个选项 - 它允许用户使用他的LDAP密码和本地密码登录!这是一个很大的安全问题.

有没有办法通过不同的身份验证提供程序登录用户,具体取决于db字段?

编辑:

我的security.yml:

 providers:
        fos_userbundle:
            id: fos_user.user_provider.username
        appbundle_user_provider:
            id: appbundle.user_provider
        fr3d_ldapbundle:
            id: fr3d_ldap.security.user.provider

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        admin:
            pattern: ^/admin.*
            context: user
            fr3d_ldap:  ~
            form_login:
                provider: appbundle_user_provider
                csrf_provider: security.csrf.token_manager
                always_use_default_target_path: true
                default_target_path: admin_main
                login_path: /admin/login
                check_path: /admin/login_check
            logout:
                path:   /admin/logout
                target: /admin/login
            anonymous:    true
Run Code Online (Sandbox Code Playgroud)

这是security.yml.这一行fr3d_ldap: ~启用了ldap bundle,它授权ldap用户并将它们保存到我的db中.没有它我无法授权它们,可能我必须编写自定义AuthenticationProvider.

Joe*_*chi 1

我对 ldap 不太熟悉,但我建议尝试完全手动登录

  $token = new UsernamePasswordToken($user, null, "firewallname", $user->getRoles());
  $securityContext = $this->container->get('security.context');
  $securityContext->setToken($token);
Run Code Online (Sandbox Code Playgroud)

然后您可以自己手动进行检查,并根据检查结果决定在进行身份验证之前如何验证用户。例如,在执行此登录代码或其他任何内容之前,根据您想要的数据库字段,通过用户名和密码运行查询。