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.
我对 ldap 不太熟悉,但我建议尝试完全手动登录
$token = new UsernamePasswordToken($user, null, "firewallname", $user->getRoles());
$securityContext = $this->container->get('security.context');
$securityContext->setToken($token);
Run Code Online (Sandbox Code Playgroud)
然后您可以自己手动进行检查,并根据检查结果决定在进行身份验证之前如何验证用户。例如,在执行此登录代码或其他任何内容之前,根据您想要的数据库字段,通过用户名和密码运行查询。