2

我正在尝试ShibbolethBundlehttps://github.com/rmoreas/ShibbolethBundle)工作。但坚持在登录时创建一个新用户。我发现这userProvider不是正确的类(ShibbolethUserProviderInterface在这里实现的类https://github.com/rmoreas/ShibbolethBundle/blob/master/Security/ShibbolethAuthProvider.php#L109

我的自定义提供程序定义如下:

namespace Meot\FormBundle\Entity;
...
class UserRepository extends EntityRepository implements ShibbolethUserProviderInterface {
...
}

安全.xml

....
security:
     providers:
         main_provider:
             entity: { class: Meot\FormBundle\Entity\User }

     firewalls:
         dev:
             pattern:  ^/(_(profiler|wdt)|css|images|js)/
             security: false
         secured_area:
             pattern:    ^/
             shibboleth: ~
             logout:
                 path: /logout
                 target: /
                 success_handler: security.logout.handler.shibboleth

我发现这本食谱 ( http://symfony.com/doc/current/cookbook/security/entity_provider.html ) 指出

为了完成实现,必须更改安全层的配置以告诉 Symfony 使用新的自定义实体提供程序而不是通用的 Doctrine 实体提供程序。通过删除 security.yml 文件的 security.providers.administrators.entity 部分中的属性字段可以轻松实现。

试过了,没用。用户提供者的类别仍然是Symfony\Bridge\Doctrine\Security\User\EntityUserProvider.

我想知道通过删除属性字段,Symfony 如何找到我的自定义用户提供程序?

谢谢。

4

1 回答 1

0

我想到了。似乎 DI 容器只是在 security.xml 中的提供程序中指定“实体”时创建“EntityUserProvider”。然后 AuthenticationProvider 只需调用用户提供程序中的方法。所以我必须为用户提供者创建一个服务,并在 security.xml 的提供者部分指定 ID。

src/Meot/FormBundle/Resources/config/services.xml

<parameters>
    <parameter key="custom_user_provider.class">Meot\FormBundle\Entity\UserRepository</parameter>
    <parameter key="custom_user_entity">Meot\FormBundle\Entity\User</parameter>
</parameters>
<services>
    <service id="custom_user_provider" class="%custom_user_provider.class%"
        factory-service="doctrine" factory-method="getRepository">
        <argument>%custom_user_entity%</argument>
    </service>
</services>
于 2013-07-05T22:42:45.610 回答