FR3DLdapBundle - 身份验证请求失败

时间:2017-04-20 07:57:33

标签: symfony authentication ldap fosuserbundle fr3dldapbundle

我使用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。 系统找到了用户,但后来我在日志文件中收到错误。

2 个答案:

答案 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