用户可以通过网络表单登录,然后将使用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
。
答案 0 :(得分:0)
您可以创建一个自定义处理程序和身份验证器:
SELECT TO_CHAR(TRANSBDATE,'MON-YYYY')PERIOD,B.CURCODE,COUNT(DISTINCT CUSTOMERID) UNIQUECUSTOMERS,COUNT(CURCODE)TRANS
FROM FX_TRANSHEADER A,FX_TRANSDETAIL B
WHERE A.TRANSNO = B.TRANSNO AND A.TRANSBDATE BETWEEN '01-JAN-2018' AND '30-JUN-2019' AND C_IDTYPE NOT IN ('CR')
GROUP BY TO_CHAR(TRANSBDATE,'MON-YYYY'),B.CURCODE
ORDER BY 1 , 4