如果您使用的是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)禁用CSRF在Symfony的防火墙检查(security.yml)
确保您注释掉现有的 “csrf_provider:” 行中的安全性。阳明:
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
#csrf_provider: form.csrf_provider
步骤3)覆盖为FOSUserBundle的安全控制器路由(的routing.yml)
在routing.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:我只要求它使用loginAction方法您的自定义SecurityController。其他两种方法转到父类(不知道它是否有所作为)。
注2:您需要“揭露:真”部分!否则,您将从fos js routing软件包中收到JavaScript错误。
这应该做到这一点!
你为什么想这样做? – j0k 2013-03-11 08:25:17
因为无论用户在登录页面上坐了多久,我的客户都希望验证登录表单。此外,我个人并不认为CSRF的保护对于这个网站是必要的。 – 2013-03-11 09:41:39