通过CURL连接到Symfony应用程序

时间:2014-02-24 22:43:10

标签: php symfony authentication curl


我有一个在Symfony中构建的应用程序。我在PHP中有另一个应用程序并尝试检查当前用户是否在Symfony应用程序中有任何帐户并验证他是否获得PHPSessionID?在这种情况下,我使用 CURL 命令,如下所示。用户名和密码是如何正确的,但symfony应用程序仍将我重定向到登录页面。有谁知道我该如何解决这个问题?

$cred_data = array('_username' => 'test1', '_password' => '123', '_target_path' => 'http://symfonyappdomain/Symfony/web/app_dev.php/Acme/HomePage');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://symfonyappdomain/Symfony/web/app_dev.php/Acme/login_check');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($cred_data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
$result = curl_exec($ch);

欣赏它

2 个答案:

答案 0 :(得分:0)

您的问题是 CSRF protection 如果您直接POST到登录表单而没有从先前的GET请求获取您的登录路由中的令牌并将其包含在你的POST请求。

为您的登录表单禁用CSRF保护(不是最佳解决方案)......

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'csrf_protection' => false,
         // ...
    ));
}

...或全局禁用它(绝对不是个好主意)

# app/config/config.yml

framework:
    csrf_protection:
        enabled: false

...或首先向登录表单发出GET请求,然后解析响应并包含在以下POST-Request中创建的CSRF令牌。确保在后续请求中包含session-cookie,否则无法验证令牌,因为它已保存在会话中。

...或实施不同的解决方案,即如果存在某个请求标头,则创建一个仅停用CSRF保护 的侦听器

答案 1 :(得分:0)

最后我可以解决这个问题。为了通过其他应用程序对用户进行身份验证,我们需要使用form_login以不同模式在 security.yml 中创建另一个防火墙,但需要禁用 required_previous_session ,请检查:

app_auth:
    pattern: ^acme/auth/application
    form_login:
        provider: same_provider_name #or use different provider
        login_path: /acme/auth/application/login
        check_path: /acme/auth/application/login_check
        require_previous_session: false
    anonymous: true
    context: my_shared_context_name

main_auth:
    pattern:     ^/acme
    form_login:  
        provider: same_provider_name #or use a different provider
        login_path: /acme/login
        check_path: /acme/login_check
    logout:
    path:   /acme/logout
    target: /acme
    security: true
    context: my_shared_context_name

请注意每个防火墙的上下文需要相同,否则您将无法在两个防火墙中使用相同的SessionID。
我想可以在主防火墙中使用* required_previous_session *而不是创建另一个防火墙,但我没有尝试(因为我不确定,我认为从外部使用单独的防火墙进行身份验证更加安全) / p>