9

我已经成功实现了自定义身份验证提供程序,但现在我还需要添加“记住我”功能,但我找不到有关如何执行此操作的文档。

我试着添加这个:

remember_me:
    key: "%secret%"
    lifetime: 31536000 # 1 year
    always_remember_me: true

但它是这样说的:

You must configure at least one remember-me aware listener (such as form-login) for each firewall that has remember-me enabled.

我找到了这个,但我不确定如何使用它:Symfony\Component\Security\Core\Authentication\Provider\RememberMeAuthenticationProvider

那么在哪里RememberMeAwareInterface?(我想有一个?比如 ContainerAware)我应该怎么处理它?

我认为我不需要编写自己的实现,默认的应该可以与我的自定义身份验证提供程序一起工作。

4

5 回答 5

5

我编写的自定义 Facebook 身份验证提供程序遇到了同样的问题。解决方案最终非常简单:

我假设您实现了一个自定义身份验证提供程序,其自定义SecurityFactoryInterface实现从Symfony\Bundle\SecurityBundle\DependencyInjection\Security\Factory\AbstractFactory. 如果你这样做了,剩下的就是配置问题:

  1. 在您的安全配置中,remember_me为您的防火墙配置功能。假设您将其配置到public防火墙中,添加的配置参数可能如下所示:

    firewalls:
        public:
            remember_me:
                key:      "%secret%"
                lifetime: 31536000 # 365 days in seconds
                path:     /
                domain:   ~ # Defaults to the current domain from $_SERVER
    
  2. 在相同的配置中,为您的身份验证提供程序启用 remember_me 功能。假设您将其配置到public防火墙中并且您的SecurityFactoryInterface实现getKey()方法返回yourAuthProviderKey,添加的配置参数可能如下所示:

    firewalls:
        public:
            yourAuthProviderKey:
                remember_me:        true
    
  3. 最后,当您的身份验证提供程序处理登录时,请确保您通过在 http 请求中_remember_me使用值命名的 http GET 或 POST 参数来请求记住我的功能1。(但请注意:如果您在安全配置中更改了其默认值,则此参数可能需要不同的名称。)例如,在我的情况下,我必须告诉 Facebook 在处理身份验证后重定向到以下 URL http://www.mydomain.com/auth-callback/?_remember_me=1:. (注意后面的部分?

希望这可以帮助!

于 2013-01-13T14:18:31.983 回答
2

你把这个添加到你的form_login部分了吗?

form_login:
    remember_me: true
于 2012-10-09T12:44:30.160 回答
1

从 Symfony 2.8 开始,“key”被替换为“secret”。所以你将拥有:

remember_me:
   secret: %secret%
   lifetime: 31536000

如果您遇到此错误,那就是修复

于 2015-07-08T10:35:02.830 回答
0

你可以试试这个:

firewalls:                   
    secured_area:
        pattern:    ^/
        anonymous: ~
        form_login:
            csrf_provider: form.csrf_provider
            login_path:  login
            check_path:  login_check
            always_use_default_target_path: true
            default_target_path: /the-cao
            remember_me: true
        logout:
            path: /logout
            target: /
        remember_me:
            key:      "%secret%"
            lifetime: 31536000 # 365 days in seconds
            path:     /
            domain:   ~ # Defaults to the current domain from $_SERVER
于 2014-10-30T04:51:40.143 回答
0

在我的情况下,它发生在我创建实现 SecurityFactoryInterface 的工厂类时(如示例“如何创建自定义身份验证提供程序”中所述)。后来我发现创建这个工厂的另一种方法是从 AbstractFactory 扩展,其中包含必要的自述文件(你可以找到它的 create() 方法)。所以有两种解决方案:1)扩展 AbstractFactory 而不是实现 SecurityFactoryInterface 2)实现 SecurityFactoryInterface 并复制粘贴自述文件相关代码。在 symfony 3.1 中:

       // add remember-me aware tag if requested
    if ($this->isRememberMeAware($config)) {
        $container
            ->getDefinition($listenerId)
            ->addTag('security.remember_me_aware', array('id' => $id, 'provider' => $userProviderId))
        ;
    }
于 2016-11-20T14:12:40.797 回答