我有一个在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);
欣赏它
答案 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>