我正在努力应对symfony的安全性组件。 我想基于第三方cookie和/或传统的登录表单来实现身份验证。 更详细一点:首先,应用程序应检查用户在我们环境中是否有来自其他应用程序的cookie。 在这种情况下,如果外部api中的会话有效,则该应用可以识别该cookie,并针对外部api对其进行验证,并验证用户身份。 如果无效或用户没有这样的cookie,则应用程序会将请求转发到普通登录表单。 我已经尝试了很多方法来实现此行为,从自定义登录表单身份验证提供程序开始,通过自定义侦听器等。

目前,我正在两个独立的安全工厂中进行尝试。 一个使用自定义侦听器和提供程序实现SecurityFactoryInterface,另一个使用自定义提供程序和默认侦听器扩展FormLoginFactory。

这里是一些当前状态的示例代码:

CustomCookieSecurityFactory.php

class CustomCookieSecurityFactory implements SecurityFactoryInterface
{
  public function create(ContainerBuilder $container, $id, $config, $userProvider, $defaultEntryPoint)
  {
    $providerId = 'security.authentication.provider.custom.cookie.'.$id;
    $container
        ->setDefinition($providerId, new DefinitionDecorator('security.authentication.provider.custom.cookie'))
        ->replaceArgument(0, new Reference($userProvider))
    ;

    $listenerId = 'security.authentication.listener.custom.cookie.'.$id;
    $listener = $container->setDefinition($listenerId, new DefinitionDecorator('security.authentication.listener.custom.cookie'));

    return array($providerId, $listenerId, $defaultEntryPoint);
  }

  public function getPosition()
  {
    return 'pre_auth';
  }

  public function getKey() {
    return 'custom_cookie';
  }
}  

CustomFormLoginSecurityFactory

class CustomFormLoginSecurityFactory extends FormLoginFactory
{
  public function getKey()
  {
    return 'custom_form_login';
  }

  /**
   * Create custom provider.
   *
   */
  protected function createAuthProvider(ContainerBuilder $container, $id, $config, $userProviderId)
  {
    $provider = 'security.authentication.provider.custom.form.'.$id;
    $container
    ->setDefinition($provider, new DefinitionDecorator('security.authentication.provider.custom.form'))
    ->replaceArgument(0, new Reference($userProviderId))
    ->replaceArgument(2, $id)
    ;

    return $provider;
  }
}

service.yml

security.authentication.listener.custom.cookie:
    class: AppBundle\Security\Http\Firewall\CustomCookieAuthenticationListener
    arguments: ["@security.token_storage", "@security.authentication.manager", "@service_container", "@logger"]

security.authentication.provider.custom.cookie:
    class: AppBundle\Security\Authentication\Provider\CustomCookieAuthenticationProvider
    arguments: ["", "@logger"]

security.authentication.provider.custom.form:
    class: AppBundle\Security\Authentication\Provider\CustomFormLoginAuthenticationProvider
    arguments: ["", "@security.user_checker", "", "@security.encoder_factory", true, "@logger", "@custom_router", "@doctrine.orm.entity_manager", "@request_stack"]

安全性

firewalls:
    dev:
        pattern: ^/(_(profiler|wdt|error)|css|images|js)/
        security: false

    secured_area:
        anonymous: ~
        custom_cookie: ~
        custom_form_login:
            provider: custom_user
            login_path: /login
            check_path: /login-check
            username_parameter: form[username]
            password_parameter: form[password]
        logout:
            path:   /logout
            target: /

我的主要问题是,如果基于cookie的身份验证不起作用,则不会调用第二种身份验证。 也许我的方式完全错误,或者只是没有正确配置防火墙。

能够从知道symfony的安全组件的人员那里获得一些帮助会很好。

#1楼 票数:0

根据Symfony2文档,您可以在security.yml使用simple_preauth参数:

# app/config/security.yml
security:
    # ...

    firewalls:
        secured_area:
            pattern: ^/admin
            stateless: false
            simple_preauth:
                authenticator: apikey_authenticator
            provider: api_key_user_provider

    providers:
        api_key_user_provider:
            id: api_key_user_provider

您还可以连锁提供程序

  ask by grudda translate from so

未解决问题?本站智能推荐:

1回复

Symfony 4 - JSON身份验证无效

我正在尝试基于这个文档在Symfony中构建一个json身份验证机制: https : //symfony.com/doc/current/security/json_login_setup.html 这是我的security.yaml 这是我在安全控制器中登录的方法 这是
1回复

跟踪多个设备之间的登录cookie

因此,我只是构建/破解了我的第一个cookie验证公式,似乎可以正常工作,但是我意识到,当用户登录多个设备以及一个测试仪报告运行缓慢时,它不能满足要求(我无法直接证明Cookie)。 我确实认识到解决多设备问题的几种可能方法,但是由于我以前从未真正使用过cookie,因此,我希望一些专家提出最
1回复

在Symfony 3中使用不同的登录表单

以下设置: 对于两个不同的用户,我有两个不同的登录部分。 第一个用户是普通用户(Entity:AppBundle:User),第二个用户是admin(Entity:AppBundle:Admin)。 我有两个不同的登录路径,提供程序,防火墙和编码器。 我可以以用户身份或以管理
1回复

具有电子邮件身份验证的内存管理员用户中的Symfony

我正在使用扩展AbstractFormLoginAuthenticator的类对我的应用程序进行身份验证。 登录表单具有电子邮件和密码字段。 我需要在内存中有一个硬编码的用户,并且能够通过该登录表单登录。 我如何配置安全文件以使其正常工作? 在提供程序下的security.yml文
2回复

如何通过PHP curl登录使用Facebook Connect的网站

我需要在使用facebook connect登录的网站上使用php curl登录我的帐户。 我将以我最喜欢的应用程序之一为例: Mousehunt 如您所见,它(当然)使用facebook登录:如果您已经连接到facebook,它将成功自动登录,否则将弹出facebook登录。
1回复

Symfony2-如何从另一个项目的cookie中设置会话

我有两个项目1和2。 项目1是纯php,项目2是symfony。 我在项目1中有一个登录功能,它将生成一个cookie。 然后,我想将此Cookie与项目2一起使用,这样就不必再次登录。 用户数据库是相同的。 先感谢您。
1回复

PHP-在一页应用程序中更新cookie和会话的策略

我看过这篇文章: 更新.net和php之间的表单身份验证票证到期的好策略是什么? 该文章建议在用户访问的每个PHP页面上更新cookie。 如果我正在设计一个一页应用程序,那么以下哪些方法可以工作,或者有什么更好的方法来更新会话和cookie以使用户保持登录状态? 场景:
1回复

如何覆盖Symfony2登录验证码控制?

首先; 将Captcha添加到Symfony2登录页面 我看到上面的谈话,但这不完全是我想要的。 我只是想在验证之前检查验证码是否为假。 不,我不想使用捆绑包。 我需要知道,当symfony2执行安全登录事件时? 图: 登录表单提交 - >检查验证码