Symfony安全防火墙JSON响应

时间:2019-07-09 10:17:04

标签: symfony symfony4 symfony-security

用户可以通过网络表单登录,然后将使用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

1 个答案:

答案 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