我使用FR3DLdapBundle和FOSUserBundle。
Symfony版本3.2.6 FR3DLdapBundle第3版
config.yml
fos_user:
db_driver: orm # other valid values are 'mongodb' and 'couchdb'
firewall_name: main
user_class: AppBundle\Entity\User
from_email:
address: "%mailer_user%"
sender_name: "%mailer_user%"
fr3d_ldap:
driver:
host: ldap.forumsys.com
port: 389
username: cn=read-only-admin,dc=example,dc=com
password: password
bindRequiresDn: true
user:
baseDn: dc=example,dc=com
filter: (&(objectClass=person))
attributes:
- { ldap_attr: uid, user_method: setUsername }
security.yml
encoders:
FOS\UserBundle\Model\UserInterface: bcrypt
AppBundle\Entity\User: plaintext
erase_credentials: false
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN]
providers:
chain_provider:
chain:
providers: [fr3d_ldapbundle,fos_userbundle]
fr3d_ldapbundle:
id: fr3d_ldap.security.user.provider
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/
fr3d_ldap: ~
form_login:
provider: chain_provider
always_use_default_target_path: true
default_target_path: /
logout: true
anonymous: true
encoders:
AcmeBundle\Acme\User\LdapUser: plaintext
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, role: ROLE_USER }
我使用Online LDAP Test Server测试服务。 我已成功使用以下配置成功登录:
fr3d_ldap:
driver:
host: ldap.forumsys.com
port: 389
#version: 3
username: cn=read-only-admin,dc=example,dc=com
password: password
bindRequiresDn: true
user:
baseDn: uid=euclid,dc=example,dc=com
filter: (&(objectClass=person))
attributes:
- { ldap_attr: uid, user_method: setUsername }
但是这个配置的问题我只能以用户euclid身份登录。但我想以每个可用的用户身份登录。
但是使用另一个配置我在日志中收到消息,发现用户已经发现但是已经进行了预算。
2017-04-20 09:36:16] ldap_driver.DEBUG:ldap_search(dc = example,dc = com,(&(&(objectClass = person))(uid = einstein)),[array] ){"行动":" ldap_search"," base_dn":" dc =示例,dc = com","过滤&# 34;:"(&(&(objectClass = person))(uid = einstein))","属性":[]} []
[2017-04-20 09:36:17] security.INFO:用户einstein在LDAP上找到{" action":" loadUserByUsername"," username&#34 ;:"爱因斯坦","结果":"找到"} []
[2017-04-20 09:36:17] ldap_driver.DEBUG:ldap_bind(爱因斯坦,****){"行动":" ldap_bind",&#34 ; bind_rdn":"爱因斯坦"} []
[2017-04-20 09:36:17] ldap_driver.DEBUG:异常' Zend \ Ldap \ Exception \ LdapException'使用消息' 0x1:无法检索帐户的DN:爱因斯坦[0x1:意外的结果计数(16):(&(objectClass = person))]'在/vendor/zendframework/zend-ldap/src/Ldap.php:805堆栈跟踪:#0 /vendor/fr3d/ldap-bundle/Driver/ZendLdapDriver.php(82):Zend \ Ldap \ Ldap-> bind( '爱因斯坦'密码')#1 /vendor/fr3d/ldap-bundle/Ldap/LdapManager.php(78):FR3D \ LdapBundle \ Driver \ ZendLdapDriver-> bind(对象(AppBundle \ Entity \ User),'密码')#2 /vendor/fr3d/ldap-bundle/Security/Authentication/LdapAuthenticationProvider.php(90):FR3D \ LdapBundle \ Ldap \ LdapManager-> bind(对象(AppBundle \ Entity \ User),'密码')#3 ...
[2017-04-20 09:36:17] ldap_driver.DEBUG:ldap_search(dc = example,dc = com,(&(&(objectClass = person))(uid = einstein)),[array ]){" action":" ldap_search"," base_dn":" dc = example,dc = com"," filter& #34;:"(&(&(objectClass = person))(uid = einstein))","属性":[]} []
[2017-04-20 09:36:17] security.INFO:用户einstein在LDAP上找到{" action":" loadUserByUsername"," username&#34 ;:"爱因斯坦","结果":"找到"} []
[2017-04-20 09:36:17] security.INFO:身份验证请求失败。 {" exception":" [object](Symfony \ Component \ Security \ Core \ Exception \ BadCredentialsException(code:0):凭据错误。在/ vendor / symfony / symfony / src / Symfony /组件/安全性/核心/身份验证/提供者/ UserAuthenticationProvider.php:90,Symfony \ Component \ Security \ Core \ Exception \ BadCredentialsException(代码:0):提供的密码无效。在/ vendor / symfony / symfony / src / Symfony /Component/Security/Core/Authentication/Provider/DaoAuthenticationProvider.php:67)"} []
我不知道我做错了什么,而且我刚开始使用LDAP。
修改 我像Alvin发布的示例一样更改了我的代码。 但我收到以下错误:Symfony Dev Log。 系统找到了用户,但后来我在日志文件中收到错误。
答案 0 :(得分:0)
你只需要改变你的baseDn:
df3<-spread(df,ID,SumScore)
ID Baseline Midpoint
1 3 NA
1 NA 4
1 NA NA
2 4 NA
2 NA 7
2 NA NA
我认为应该这样做。
编辑#2 - 基于反馈
根据我的教程,这是将其添加到FOSUser.php实体的解决方案:
user:
baseDn: dc=example,dc=com
参考我的教程: https://alvinbunk.wordpress.com/2016/03/25/symfony-ad-integration/
答案 1 :(得分:0)
所以我最终在我的代码中找到了问题。
我忘了正确设置用户实体中DN字段的set和get函数。那是我的代码:
/**
* Set Ldap Distinguished Name.
*
* @param string $dn Distinguished Name
*/
public function setDn($dn)
{
// TODO: Implement setDn() method.
}
/**
* Get Ldap Distinguished Name.
*
* @return null|string Distinguished Name
*/
public function getDn()
{
// TODO: Implement getDn() method.
}
但这是来自Alvins教程的正确答案:
/**
* {@inheritDoc}
*/
public function setDn($dn)
{ $this->dn = $dn; }
/**
* {@inheritDoc}
*/
public function getDn()
{ return $this->dn; }
感谢Alvin的帮助以及令人敬畏的tutorial。