当前位置: 首页 > 知识库问答 >
问题:

在登录表单上禁用CSRF令牌

方苗宣
2023-03-14

我正在使用Symfony2。0和FOSUserBundle,并希望在我的登录表单上禁用csrf令牌。

我已经禁用了csrf保护全球在我的网站在我的config.yml:

framework:
    csrf_protection:
        enabled:        false

这工作得很好,没有csrf字段添加到我的表单中。但是,这不适用于登录表单。仅在此表单上,如果我没有将令牌包含在表单中,则会出现“无效的CSRF令牌”错误:

<input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />

如何在登录表单上禁用CSRF令牌?

共有3个答案

濮冠宇
2023-03-14

如果您正在使用FOSUserBundle,并且您希望仅在登录表单上禁用CSRF保护,则需要执行以下步骤。

步骤1)创建自己的用户包

为了超越内置在FOSUserBundle中的SecurityController,您必须首先创建自己的用户包。

因此,创建一个名为app/src/{YourApp}/UserBundle/Controller/SecurityController的文件。php您应该扩展原始的SecurityController类,并通过loginAction方法进行复制

use FOS\UserBundle\Controller\SecurityController as SecurityControllerOrig;
class SecurityController extends SecurityControllerOrig
{
   public function loginAction(Request $request)
   {
   }
}

在loginAction方法中,注释掉或删除以下行:

$csrfToken = $this->container->has('form.csrf_provider')
        ? $this->container->get('form.csrf_provider')->generateCsrfToken('authenticate')
        : null;

然后确保没有向视图传递CSRF令牌的任何内容:

return $this->renderLogin(array(
        'last_username' => $lastUsername,
        'error'         => $error,
        'csrf_token' => false,
    ));

步骤2)在Symfony的防火墙(security.yml)中禁用CSRF检查

请确保在安全性中注释掉现有的“csrf_提供程序:”行。yml:

firewalls:
        main:
            pattern: ^/
            form_login:
                provider: fos_userbundle
                #csrf_provider: form.csrf_provider

步骤3)覆盖FOSUserBundle的安全控制器(routing.yml)的路由

在路由中。yml,注释掉这些行:

fos_user_security:
    resource: "@FOSUserBundle/Resources/config/routing/security.xml"
    options:
        expose: true

在注释掉的行下面添加这些行:

#Over-ride the SecurityController of the FOSUserBundle:
fos_user_security_login:
  path: /login
  defaults:  { _controller: YourAppUserBundle:Security:login }
  methods:  [GET]
  options:
    expose: true

fos_user_security_check:
  path: /login_check
  defaults:  { _controller: FOSUserBundle:Security:check }
  methods:  [POST]
  options:
    expose: true

fos_user_security_logout:
  path: /logout
  defaults:  { _controller: FOSUserBundle:Security:logout }
  methods:  [GET]
  options:
    expose: true

注1:我只要求它使用自定义SecurityController中的loginAction方法。其他两个方法转到父类(不确定是否有区别)。

注2:你需要“揭露:真实”部分!否则,您将从fos js路由包中获得一个JavaScript错误。

那应该可以了!

况庆
2023-03-14

如果你去你的保安处。yml文件,并从form_login指令中删除csrf_提供程序,无需更新action类或任何内容。

蒋畅
2023-03-14

您可以通过设置“CSRF\u保护”在窗体类中禁用CSRF保护=

class LoginType extends AbstractType
{
    // ...

    public function getDefaultOptions(array $options)
    {
        return array(
            'data_class'      => 'Acme\UserBundle\Entity\User',
            'csrf_protection' => false
        );
    }

    // ...

} 

如果使用FormBuilder而不是AbstractType类来创建表单,则可以将选项数组作为createFormBuilder()的第二个参数传递,如下所示:

$form = $this->createFormBuilder($users, array('csrf_protection' => false))
        ->add( ... )
        ->getForm();

 类似资料:
  • 我正在使用python的请求模块尝试登录网页。我打开了一个窗口。session(),然后我得到cookie和csrf令牌,它包含在meta标记中。我使用用户名、密码、一个隐藏的输入字段和meta标记中的csrf令牌来构建有效负载。之后,我使用post方法,传递登录url、cookie、负载和头。但在那之后,我无法访问登录页面后面的页面。我做错了什么? 这是我执行登录时的请求标头: 到目前为止,这是

  • 问题内容: 我正在构建一个通过webservices与symfony2应用程序对话的移动应用程序,我找不到在特定控制器/操作上禁用csrf保护的方法 我想将注册数据发布到此操作并使用sf2表单验证。我没有在移动应用程序中致电该表格 无法在操作中更改容器参数,因为它是冻结参数而引发异常… 我不想禁用整个应用程序的表单保护 有什么线索吗? 谢谢 ! 更新:使用symfony 2.1.x 问题答案: 如

  • 似乎Springboot自动配置自己来使用Tomcat的Logback。我想禁用它,并使用我在类路径中提供的一个。 LoggerFactory不是LoggerContext,但Logback位于类路径上。删除Logback或类[org.slf4j.impl.SimpleLoggerFactory]的竞争实现(类org.slf4j.impl.SimpleLoggerFactory)对象必须是类ch.

  • 根据,我使用基本和基于表单的身份验证配置了Spring Security。 我希望下的endpoint不要使用基于表单的安全性。之外的其他endpoint应使用基于表单的登录。我想要一个响应,发送给那些没有在下提供凭据的endpoint的任何调用。 更新:感谢卢克·泰勒在下面的评论,我想出了以下解决方案。 注意:此技术仅适用于Spring Security 3.1。 首先,我挑出。我们从不创建会话

  • 我尝试使用这个简单的代码登录,但在我点击登录按钮后,else选项“无效用户名或密码!”总是出现,即使用户名和密码是匹配的 控制器:

  • 我将使用CSRF codeigniter和ajax进行安全登录。但是我有一个问题,我的语法。 这是我的表格: 这是我的javascript: 和我的控制器: 我的模型是: