自定义UserProvider配置symfony 4

时间:2019-07-09 07:39:42

标签: symfony ldap php-7.3 symfony-4.3

我想创建自己的LdapUserProvider来对用户名应用不同的角色。 准确地说,我的LDAP与symfony中的默认LdapUserProvider一起使用时效果很好。

正如LDAP doc所说:

ldap用户提供程序,使用LdapUserProvider类。像所有其他用户提供程序一样,它可以与任何身份验证提供程序一起使用。

如何使用定制的用户提供程序?

security:
        providers:
            my_ldap:
                ldap:
                    service: Symfony\Component\Ldap\Ldap
                    base_dn: o=xxx
                    search_dn: cn=xxx Downloader,ou=ApplicationUsers,o=xxx
                    search_password: 'xxx'
                    default_roles: [ROLE_USER]
                    uid_key: uid
                    filter: "{uid_key}={username}"

        firewalls:
            dev:
                pattern: ^/(_(profiler|wdt)|css|images|js)/
                security: false
            main:
                anonymous: true
    #            provider: App\Services\MyLdapUserProvider
                logout:
                    csrf_token_id: logout
                    path: /logout
                    target: /login
                form_login_ldap:
                    csrf_parameter: _csrf_token
                    login_path: login
                    check_path: login
                    service: Symfony\Component\Ldap\Ldap
                    dn_string: 'o=xxx'
                    query_string: 'uid={username}'
                    target_path_parameter: home
                    default_target_path:  /home

        access_control:
            - { path: /index, role: IS_AUTHENTICATED_FULLY }
            - { path: ^/admin, roles: ROLE_ADMIN }

编辑: 谢谢您的回答@Vyctorya

我认为这就是我所需要的!

在security.yaml中,这就是我所谓的服务的方式:

security:
        providers:
            myLdap:
                id: App\Services\MyLdapUserProvider

这是我的service.yaml:

services:
        App\Services\MyLdapUserProvider:
            arguments:
                $ldap: '@Symfony\Component\Ldap\LdapInterface'
                $baseDn: 'o=xxx'
                $searchDn: 'cn=xxx Downloader,ou=ApplicationUsers,o=xxx'
                $searchPassword: 'xxx'
                $defaultRoles:
                    'ROLE_USER'
                $uidKey: 'uid'
                $filter: '{uid_key}={username}'

        Symfony\Component\Ldap\LdapInterface:
            arguments: ['@Symfony\Component\Ldap\Adapter\ExtLdap\Adapter']

        Symfony\Component\Ldap\Adapter\ExtLdap\Adapter:
            arguments:
                - host: ....

我不理解为什么未定义baseDn ...

无法自动装配服务“ App \ Services \ MyLdapUserProvider”:方法“ Symfony \ Component \ Security \ Core \ User \ LdapUserProvider :: __ construct()”的参数“ $ baseDn”是类型提示的“字符串”,您应该明确配置其值。

1 个答案:

答案 0 :(得分:0)

看看这个Symfony Documentation

您需要调整配置:

security:
    providers:
        enter_you_custom_name_here:
            id: AppBundle\Security\User\UserProvider

并创建UserProvider。扩展Symfony\Component\Security\Core\User\LdapUserProvider并覆盖loadUserByUsername($username)