symfony - Symfony 安全防火墙 JSON 响应
问题描述
用户可以通过 Web 表单登录,然后使用 javascript 客户端访问 api。如果用户没有登录 api 应该返回一个带有 403 错误的 json 响应,站点上的任何其他页面应该继续重定向到登录页面。
存在以下防火墙:
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_token_generator: security.csrf.token_manager
logout: true
anonymous: true
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api/, role: ROLE_USER }
登录表单正常工作并且 /api/ 路由是安全的。
如果 javascript 客户端曾经访问过 /api/* 并且用户没有登录,他们应该会收到 403 json 响应,目前他们会收到 302 重定向到 /login 页面。用户可能未登录,因为会话可能已过期。
当用户没有为 /api/ 路由登录时,如何返回 JSON 响应?
我尝试创建各种事件侦听器,但找不到正确的事件;以下仅触发失败的登录表单事件。
App\EventListener\SecurityListener:
tags:
- { name: kernel.event_listener, event: security.authentication.failure, method: onFailure }
我还可以检查每个控制器方法! isGranted(ROLE_USER)
并返回JsonResponse(message: "please login", status: 403)
,但这不是非常理想,并且会导致大量重复代码,必须有一个更简单的解决方案。
javascript 客户端将始终发送标头Content-Type: application/json
。
解决方案
您可以创建自定义处理程序和身份验证器:
form_login:
csrf_token_generator: security.csrf.token_manager
provider: fos_userbundle
login_path: /login
check_path: /login_check
success_handler: 'your_custom_login_success_handler'
failure_handler: 'your_custom_login_failure_handler'
guard:
authenticators:
- App\Security\TokenAuthenticator
推荐阅读
- dropwizard - ScheduledExecutorService 停止计划的可运行任务,然后在一段时间后重新运行正常
- sql-server - 遇到重复时附加来自其他列的值
- python - 如何从 github 上的 master 分支安装 pip 模块?
- r - 使用混合日期格式解析日期向量
- node.js - RequestError:只能在 LoggedIn 状态下发出请求,而不能在 SentClientRequest 状态下发出请求
- asp.net-mvc - 为什么“requireSSL='true'”会引发 IIS 错误
- azure - 如何在 Azure 应用服务中创建虚拟目录并部署包
- javascript - 在反应中调用checked和onchange事件时检索局部变量的方法
- java - 如何抑制一些 Maven 日志但保留其他输出?
- python - 按具有索引的系列设置多索引 DataFrame 列