Symfony2:AJAX请求:如何在需要时处理身份验证?

2023-12-08

使用 Symfony2,我实现了 AJAX 操作来管理应用程序中的一些书签(添加/删除)。因此,用户需要经过身份验证才能继续。 我有一个将用户重定向到登录页面的解决方案,但我认为最好使用事件来处理此重定向。

实际解决方案:

检查用户身份验证的方式与 FOSUserBundle 中的方式相同。

路由:

fbn_guide_manage_bookmark:
    path:  /bookmark/manage
    defaults: { _controller: FBNGuideBundle:Guide:managebookmark }
    options:
        expose: true
    requirements:
        _method:  POST 

控制器 :

public function manageBookmarkAction(Request $request)
{
    if ($request->isXmlHttpRequest()) {

        $user = $this->getUser();

        if (!is_object($user) || !$user instanceof UserInterface) {            
            return new JsonResponse(array('status' => 'login'));
        } 

        // DO THE STUFF
    }   
}

jQuery :

$(function() {
    $('#bookmark').click(function() {
        $.ajax({
            type: 'POST',                  
            url: Routing.generate('fbn_guide_manage_bookmark'),
            data : xxxx, // SOME DATA
            success: function(data) {                
                if (data.status == 'login') {
                    var redirect = Routing.generate('fos_user_security_login');
                    window.location.replace(redirect);
                } else {
                    // DO THE STUFF       
                }
            },
        });
    }); 
});

其他解决方案? :

为了不在控制器级别验证用户是否已通过身份验证,我将在安全配置文件中保护我的路由:

安全 :

security:
    access_control:
        - { path: ^/(fr|en)/bookmark/manage, role: ROLE_USER }

控制器 :

public function manageBookmarkAction(Request $request)
{
    if ($request->isXmlHttpRequest()) {

        $user = $this->getUser();

        // THIS VERIFCATION SHOULD NOW BE REMOVED
        /*
        if (!is_object($user) || !$user instanceof UserInterface) {            
            return new JsonResponse(array('status' => 'login'));
        } 
        */

        // DO THE STUFF
    }   
}   

基本上,当尝试这个解决方案时,Symfony2 会在内部重定向大量登录页面,正如您在 Firebug 中看到的那样:

enter image description here

所以我的问题是:

  1. Symfony2 在重定向之前是否抛出事件或异常?例如,这将允许使用侦听器来捕获事件并设置 JSON 响应?
  2. 在这种情况下,应该准备什么样的应对措施呢?就像我的第一个使用 HTTP 标头代码(如 302(或其他代码))的解决方案。如何在 AJAX 级别处理这个问题?

我可以看到一些基于异常事件的解决方案,但我认为有必要在控制器级别引发异常,这是我想避免的。这是一个例子:

https://github.com/winzou/AssoManager/blob/master/src/Asso/AMBundle/Listener/AjaxAuthenticationListener.php


这是一个解决方案(参见here详情):

安全 :

firewalls:
        main:
            pattern:   ^/
            anonymous: true
            provider: fos_userbundle
            entry_point: fbn_user.login_entry_point
            #...
    access_control:
        - { path: ^/(fr|en)/bookmark/manage, role: ROLE_USER }

服务 :

services:

    fbn_user.login_entry_point:
        class: FBN\UserBundle\EventListener\LoginEntryPoint
        arguments: [ @router ]

服务等级:

namespace FBN\UserBundle\EventListener;

use Symfony\Component\Security\Http\EntryPoint\AuthenticationEntryPointInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\JsonResponse;

/**
 * When the user is not authenticated at all (i.e. when the security context has no token yet), 
 * the firewall's entry point will be called to start() the authentication process. 
 */

class LoginEntryPoint implements AuthenticationEntryPointInterface
{
    protected $router;

    public function __construct($router)
    {
        $this->router = $router;
    }

    /**
     * This method receives the current Request object and the exception by which the exception 
     * listener was triggered. 
     * 
     * The method should return a Response object
     */
    public function start(Request $request, AuthenticationException $authException = null)
    {
        if ($request->isXmlHttpRequest()) {  

            return new JsonResponse('',401);

        }

        return new RedirectResponse($this->router->generate('fos_user_security_login'));
    }
}

jQuery :

$(function() {
    $('#bookmark').click(function() {
        // DATA PROCESSING
        $.ajax({
            type: 'POST',                  
            url: Routing.generate('fbn_guide_manage_bookmark'),
            data : xxxx, // SOME DATA,
            success: function(data) {
                // DO THE STUFF 
            },
            error: function(jqXHR, textStatus, errorThrown) {
                switch (jqXHR.status) {
                    case 401:
                        var redirectUrl = Routing.generate('fos_user_security_login');
                        window.location.replace(redirectUrl);
                        break;
                    case 403: // (Invalid CSRF token for example)
                        // Reload page from server
                        window.location.reload(true);                        
                }               
            },
        });
    }); 
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Symfony2:AJAX请求:如何在需要时处理身份验证? 的相关文章

  • JQuery 颜色盒

    如何在没有事件绑定的情况下在页面加载时显示 Colorbox 更简单地说 我希望 Colorbox 在页面加载时立即加载 这是我目前正在使用的 Colorboxhttp colorpowered com colorbox http colo
  • Bootstrap 选项卡在另一个页面上打开选项卡

    我有一个页面 上面有引导选项卡 它们链接到该页面上的正确内容区域 当您离开该页面时 我在顶部有相同的选项卡 我希望将他们带回上一页并打开右侧选项卡 这就是我的选项卡在外部页面上的样子 ul class nav nav tabs li a h
  • 使用 jquery ajax 和 asp.net 处理程序上传文件

    我正在努力让它工作 但我在上传文件时遇到错误 ASPX
  • Python:创建登录系统[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想使用 python 创建一个登录
  • 包含来自 twig 的非 twig 文件

    我需要将文件的内容 在我的资源文件夹内 包含在 Twig 模板中 我尝试过这个但没有运气 include public directory file ext Twig没有这个能力吗 我不想使用Assetic 1 15版本新增 Twig 1
  • Jqgrid获取我们输入的值并更改表单的可编辑属性

    对不起 伙计们 但我遇到了这两个问题 我希望你们能帮我解决这个问题 这是我的代码的一部分 jQuery VWWMODULE jqGrid url loadstatic php q 2 t CORE VW WMODULE datatype j
  • 禁用外部点击时关闭模式

    我正在制作一些使用模式的博客物质化 但我的模态 onclick 外部和错误数据有问题 这是我的代码 main js function changepassword var user userlog val var content conte
  • 启用scrollX 时标题列与DataTable 不对齐

    我遇到了这个插件反复出现的问题 启用scrollX选项时 标题列未对齐 我尝试了在 stackoverflow 上阅读的许多解决方案 但没有成功 可能是插件版本的问题 但是 这是我的数据表设置 var oTable table dataTa
  • 从 JavaScript 加载图像

    在我的专辑幻灯片放映页面上 我有类似的代码 span style display none img src imageUrl span span show loader span in showImage 我确定图像已加载 因此我显示图像并
  • 为什么我的事件处理程序会导致“不是函数”错误,但可以在 Firebug 控制台中运行?

    使用JQuery 1 2 6 在Firefox 3和IE7上进行测试 我有一些非常基本的 JavaScript 代码来重新加载验证码图像 在我的 JS 文件中 我有 var Captcha count 0 Refresh function
  • DataTables 第 2 页的分页未调用放大弹出窗口

    所以我有这个启用分页的数据表 我编码了一种方式 以便用户可以编辑表的行 当用户调用它在放大弹出窗口中打开的编辑页面时 它在第 1 页 从第 2 页起都运行良好 DataTable 及其前面停止调用 Magnific Popup 我只是不明白
  • 在 iOS Safari 上滚动后锚点失去点击能力

    使用它来获取点击次数 nav li a click function event event preventDefault target this attr href replace goToByScroll target 这是滚动功能 f
  • 将SQL数据引入jquery availabletag

    我正在尝试制作自动完成文本框 但如何将 SQL 数据包含到 jquery 可用标记并循环它 我无法根据以下代码执行该功能 任何帮助 将不胜感激 谢谢 这是我的预期输出 预期结果演示 http jsfiddle net VvETA 71 jq
  • Twitter Bootstrap - 下拉菜单 - 箭头键不适用于 Firefox 中的输入标签

    要求 我想在带有用户名和密码字段的下拉菜单中放置一个登录表单 我可以做到这一点 除了以下问题之外 一切正常 Issue 打字时我无法使用箭头键 上 下 firefox 当输入位于下拉代码之外时 这很有效 这适用于其他浏览器 例如 googl
  • Jquery.Validate - 基于哪个选项卡添加/删除规则

    我有一个 Bootstrap 4 选项卡式界面 每个选项卡上都有输入框 我想允许用户根据他们所在的选项卡输入不同的必填字段 因此我希望根据该选项卡添加或删除验证 无论用户位于哪个选项卡 还有一些强制输入 我所做的是创建一个默认验证函数 添加
  • 检查浏览器空闲的替代方法

    我有一个简单的网络信息亭 在鼠标未使用 jQuery 移动 30 秒后显示用户操作提示 var i null body wrap mousemove function clearTimeout i overlay fadeOut i set
  • 议程周视图中的标题显示因加载的 fullcalendar js 文件而异

    在议程周视图中 日历标题中各天之间显示的破折号根据我加载的 fullcalendar js 显示有所不同 例如 如果我加载完整的 calendar js 文件 它会按预期工作 2015 年 2 月 8 日至 14 日 使用此脚本标签 当我尝
  • HTTP 基本身份验证 + 访问令牌?

    我正在开发一个 REST API 计划将其与 Web 和 IOS 应用程序一起使用 我打算让这个 API 在一段时间内保持私有 私有意味着我只希望我的 Web 应用程序和 ios 应用程序访问该 API 我已经阅读了许多不同的身份验证方法
  • 如何检查用户电子邮件的唯一性并将结果传递给 jQuery?

    我有这个问题 我正在控制器中检查用户电子邮件并发送 json 成功响应 如果已获取 并添加输入的 css 样式 我还需要阻止提交并添加一些消息 这是我的检查电子邮件操作 使用本文 http paydrotalks com posts 45
  • 如何使用文本输入来定位?

    我想使用 jQuery 通过文本框转到锚点 例如 我想使用以下形式

随机推荐

  • PWA 关闭时发送通知

    我制作了一个 PWA 待办事项列表应用程序 链接到应用程序 使用角度 我现在计划添加通知 以便在应用程序关闭时可以到达用户 由于它是一个离线工作的 PWA 我不能依赖推送通知 提前致谢 你可以利用Web 定期后台同步 API您也可以离线运行
  • 使用 Android 进行录制时显示不断更新的双精度(频率)

    我正在构建一个 Android 应用程序 它使用 FFT 算法显示持续音符的频率 我正在使用 Jtransform 方法 目前我的问题是我无法在屏幕上显示频率 以下代码是 fft 频率计算和 AsynchTask 应在文本框中显示频率 im
  • Python 列表到 XML,反之亦然

    我编写了一些将 python 列表转换为 XML 元素的 python 代码 它用于与 LabVIEW 交互 因此采用了奇怪的 XML 数组格式 无论如何 这是代码 def pack data create the result eleme
  • 无法转换日期 - LocalDate 减去一天

    我对日期及其从 Date 到 LocalDate 的传递有疑问 主要错误在于年份为 1700 年的日期 我尝试过两个不同的日期 每当年份是 1700 年时 我就会少一天 Date dto Instant inst dto toInstant
  • android 如何限制ListView中列表项的显示和按钮显示更多

    我正在从数据库获取数据并在 ListView 中使用自定义列表适配器进行显示 我只需要在 ListView 中显示 10 个项目 在第 10 项之后 会显示一个带有文本 显示更多 的按钮 当单击此按钮时 会在列表视图中显示数据库中的更多 1
  • raw 无法解析或不是字段

    我正在我的应用程序中构建 MP3 播放器 但收到一条错误消息 指出 raw 无法解析或不是字段 mMediaPlayer MediaPlayer create this R raw test cbr 我不确定 R raw test cbr
  • javascript 闭包无法正常工作

    看第一段代码 var count 0 function addLinks var count 0 this count var is increasing for var i 0 link i lt 5 i link document cr
  • 如何使用 Microsoft Graph 更新 SharePoint 中的查找字段和用户字段?

    我正在寻找一种如何使用 Microsoft graph 更新查找字段和用户字段的方法 我可以读取该项目 但即使我输入了正确的 ID 值 也找不到创建或更新此类字段的方法 现在支持通过 Microsoft Graph API 更新查找字段 假
  • 带有循环调试打印的 ansible 寄存器不起作用

    我有一个简单的剧本 应该显示我的服务状态 我想查看机器的输出以查看状态是否处于活动状态 所以我使用了调试打印 如下所示 name name of services shell systemctl status item with items
  • Flutter:更新列表中的特定索引(Firestore)

    究竟如何根据索引更新列表中的特定值 例如 在以下列表中 0 first name name0 last name lastName0 1 first name name1 last name lastName1 如何仅更新 lastName
  • glassfish 的基本身份验证失败

    首先 我对这篇长文表示歉意 这是我之前问题的延续 7u21更新后弹出需要验证的窗口 关于这个问题 但我缩小了搜索范围 简而言之 自 Java 7u21 以来 我的 BASIC 身份验证似乎已被破坏 通过 JNLP 文件启动的小程序根本无法稳
  • 使用清晰的代码行异步调用插槽,无需连接到它

    我遇到了相当奇怪的错误 QAction trigger导致出现阻塞对话框 这导致我的服务器调用trigger卡住 例如 在对话框关闭之前无法处理套接字信号 我想出了一个解决方法 我连接信号void triggerWorkaround 到插槽
  • 模态中的文本字段

    如果我们使用列表视图 当键盘出现时 文本字段就会上升 但在模式中则不会 抱歉 我不知道如何正确解释它 我只会用图像向您展示 模式代码 showModalBottomSheet shape RoundedRectangleBorder bor
  • ASP.NET Web 应用程序消息框

    在 asp net windows 窗体应用程序中 您可以在后面的 C 代码中使用 MessageBox Show Here is my message ASP NET Web 应用程序中有类似的东西吗 我可以从后面的 C 代码中调用一些向
  • 有人可以澄清 Android 上下文引用吗?

    我的误会还在继续 任何人都可以引用正确使用的参考资料get Context 我得到了关于使用的相互矛盾的建议getBaseContext getApplicationContext and getContext 我的理解是使用this是一个
  • 如何在VIPS中进行透视扭曲变换?

    是否可以执行以下 ImageMagick透视扭曲使用 VIPS 命令 如果是这样 命令是什么 使用ruby vips convert my file png matte virtual pixel transparent distort P
  • 为小字符增大 SKLabelNode 的触摸区域

    我在我的游戏中添加了一个老式的高分输入屏幕 用户点击每个字母来输入他们的名字 每个字母 符号或短语 DEL SP 等 都是一个SKLabelNode而且点击 和 非常困难 不过字符和一些符号 每次点击都会通过通常的方式检测到touchesB
  • 在 x86-64、skylake 上以可重启序列优化 percpu 2 级位向量

    我很好奇如何最好地优化下面的程序集 特别是 跳到此处查看程序集 下的代码块中的部分 以便于 control f 搜索 我正在编写一些代码 HOT HOT HOT 路径基本上是在位向量中查找 0 位并返回该位 位向量由以下部分组成 struc
  • 如何使用 jQuery 查找文本并替换

    我试图找到一个解决方案来搜索 DOM 中包含的文本字符串 Tony 并将其替换为文本字符串 Tiger 有人对如何做到这一点有任何见解或想法吗 我猜它需要每个语句加上替换函数并且可能包含 谢谢 杰克 您可以使用它来搜索 body 元素的所有
  • Symfony2:AJAX请求:如何在需要时处理身份验证?

    使用 Symfony2 我实现了 AJAX 操作来管理应用程序中的一些书签 添加 删除 因此 用户需要经过身份验证才能继续 我有一个将用户重定向到登录页面的解决方案 但我认为最好使用事件来处理此重定向 实际解决方案 检查用户身份验证的方式与