如果您正在使用 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 检查
确保注释掉 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:我只要求它使用自定义 SecurityController 中的 loginAction 方法。其他两种方法转到父类(不确定是否有区别)。
注意2:您需要“expose:true”部分!否则,你会从 fos js 路由包中得到一个 JavaScript 错误。
应该这样做!