我正在尝试在Symfony应用程序中实现Active Directory身份验证。
我似乎无法成功验证。每次尝试通过Web表单登录时都会记录以下内容:
2016-08-17 17:07:08] php.DEBUG:ldap_bind():无法绑定到服务器: 无效证件 { “类型”:2 “文件”: “/用户/ firstname.lastname /站点/ URL助洗剂/ url_builder /供应商/ symfony的/ symfony的/ SRC / Symfony的/组件/ LDAP /适配器/ ExtLdap / Connection.php”, “线”:53, “电平”:28928} [] [2016-08-17 17:07:08] security.INFO:身份验证请求失败。 { “异常”:“[对象] (Symfony的\分量\安全\核心\异常\ BadCredentialsException(代码: 0):凭据错误。在 /Users/firstname.lastname/Sites/url-builder/url_builder/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Provider/UserAuthenticationProvider.php:90, Symfony的\分量\安全\核心\异常\ BadCredentialsException(代码: 0):提供的密码无效。在 /Users/first.name/Sites/url-builder/url_builder/vendor/symfony/symfony/src/Symfony/Component/Security/Core/Authentication/Provider/LdapBindAuthenticationProvider.php:86)“} [] [2016-08-17 17:07:08] security.DEBUG:身份验证失败, 重定向触发。 {“failure_path”:“login”} [] [2016-08-17 17:07:08] request.INFO:匹配的路线“{route}”。 { “路线”: “登录”, “route_parameters”:{ “_控制器”: “UrlBuilderBundle \控制器\ SecurityController ::则loginAction”, “_路线”: “登录”}, “REQUEST_URI”: “http://www.url-builder.dev/app_dev.php/auth/login”, “方法”: “GET”} []
我已将用户提供程序配置为从数据库中读取用户:
providers:
urlbuilder_provider:
entity:
class: UrlBuilderBundle:User
property: username
我已经通过防火墙部分中的表单配置了Ldap身份验证:
provider: urlbuilder_provider
# activate different ways to authenticate
# http_basic: ~
# http://symfony.com/doc/current/book/security.html#a-configuring-how-your-users-will-authenticate
form_login_ldap:
login_path: login
check_path: login
service: app.ldap
dn_string: 'uid={username},dc=global,dc=com'
default_target_path: /manage-user
我的登录操作包含以下内容:
public function loginAction(Request $request)
{
$authenticationUtils = $this->get('security.authentication_utils');
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render(
'security/login.html.twig',
array(
// last username entered by the user
'last_username' => $lastUsername,
'error' => $error,
)
);
}
我在一个独立的PHP脚本中测试了ldap身份验证,它按预期工作。我将用户详细信息存储在数据库表中,但希望对活动目录进行身份验证。我的感觉是问题是用户名和密码是如何提交给LDAP的,但却无法完全指责它。
我很好并且真的很难过,如果有人能对此有所了解,那就表示赞赏。
我正在验证的AD中的用户名具有域“global”,因此这意味着用户名将采用以下格式:'global \ firstname.lastname'
我觉得用户名字符串中的反斜杠是我的问题的根源。我'var_dump'-ed在bind()中传递的用户名,在反斜杠之后添加字符'5c'; '全球\的图5c firstname.lastname'。如何确保正确处理反斜杠?
答案 0 :(得分:1)
我通过将dn_string: 'uid={username},dc=global,dc=com'
更改为dn_string: global\{username}
来解决了我的问题。
这意味着用户在通过表单登录时不会在其用户名中提供域名,从而避免了在反斜杠后添加“5c”的问题。
答案 1 :(得分:0)
对于Active Directory,您应在form_login_ldap
配置中使用以下DN字符串:dn_string: '{username}'
。实际上,您甚至不需要全部定义它,因为这是默认值。请参阅:http://symfony.com/doc/current/security/ldap.html#dn-string
它当前不起作用的原因是因为如果用户使用名称foo
登录表单,它将尝试使用DN字符串uid=foo,dc=global,dc=com
进行绑定。
答案 2 :(得分:-1)
我在Laravel中使用了ldap,我的代码看起来像那样。
打开连接
$ldap_connection = ldap_connect(config('app.ldap_server'), config('app.ldap_port'));
检查连接并使用ldap登录
$username = "test"
$password = "test"
if($ldap_connection){
ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, 0);
$ldap_bind = @ldap_bind($ldap_connection, $username, $password);
if($ldap_bind){
// Here you put the code for save in database
}
}
结束连接。
ldap_close($ldap_connection);