我正在使用Symfony2。0和FOSUserBundle,并希望在我的登录表单上禁用csrf令牌。
我已经禁用了csrf保护全球在我的网站在我的config.yml:
framework:
csrf_protection:
enabled: false
这工作得很好,没有csrf字段添加到我的表单中。但是,这不适用于登录表单。仅在此表单上,如果我没有将令牌包含在表单中,则会出现“无效的CSRF令牌”错误:
<input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />
如何在登录表单上禁用CSRF令牌?
如果您正在使用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错误。
那应该可以了!
如果你去你的保安处。yml文件,并从form_login指令中删除csrf_提供程序,无需更新action类或任何内容。
您可以通过设置“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: 和我的控制器: 我的模型是: