是否可以通过搜索字段使用`switch_user`?

时间:2016-01-02 17:12:18

标签: javascript jquery symfony

我尝试填充要在搜索框中使用的值,以便超级用户可以impersonate other users。但是,我遇到了下面列出的问题,我不确定是否有统一的解决方案,或者至少是否有正确的解决方案。处理它的方法:

  1. 如何传递搜索字符串以及脚本的用户名值
  2. 如何重新加载当前页面,但使用?_switch_user=jsmith(例如)
  3. 补充路径
  4. 如果超级用户在模拟一个用户(例如jsmith)与另一个普通用户之间切换,则会收到错误消息:
      

    您已经切换到" jsmith"用户。

  5. 我的搜索表单

    <form class="navbar-form navbar-left" role="search">
       <div class="form-group">
          <input type="search" id="search-names" class="form-control" placeholder="Enter username to switch to">
       </div>
       <button type="submit" class="btn btn-default">Submit</button>
    </form>
    

    脚本:

    这是我的基础树枝模板(因为表单位于所有页面的导航栏中)。我实际使用的代码是var searchnames = ["Smith, John",...,但我会以某种方式传递选择的用户名(例如jsmith)来重新加载同一页面但?_switch_user=jsmith作为参数:

    <script>
    $(function() {
        var searchnames = [
        "Smith, John" => "jsmith",
        "Doe, Jane"   => "jdoe1990",
        ];
        $( "#search-names" ).autocomplete({
        source: searchnames
        });
    });
    </script>
    

    我的想法是从我的UserRepository传递所有名称/用户名的列表,并用twig填充脚本。除此之外,我不知道从?_switch_user=

    的传递参数开始的位置

1 个答案:

答案 0 :(得分:1)

这是PHP中的关联数组:

var searchnames = [
  "Smith, John" => "jsmith",
  "Doe, Jane"   => "jdoe1990",
];

在JavaScript中,您只有normal arraysobjects。对象可用于键/值对。

source option可以获取一系列对象。每个对象都有valuelabel属性。

[
  { "label": "Smith, John", "value": "jsmith" },
  { "label": "Doe, Jane", "value": "jdoe1990" }
]

如果您有一组固定的用户,只需将它们添加到您的JavaScript函数即可。

但是,用户可能来自数据库。您可以在系统中创建所有用户的对象,将它们传递到(Twig)视图并使用json_encode filter输出它们。然而,这是不好的做法,因为它会增加HTML并增加安全风险。 (o.a.即使您注销,所有用户仍然在浏览器缓存中。)

相反,你可能想要使用AJAX。您可以将source选项设置为URL,该URL由用户控制器处理。 (见the jQuery UI remote example。)

$("#search-names).autocomplete({
  source: "/users/search"
});

搜索操作查询数据库并创建一个数组,该数组包含关联的数组,每个数组都有valuelabel键。比output it as JSON

最后要在选择选项时加载页面。这可以通过设置window.location

在JavaScript中完成
$("#search-names").autocomplete({
  source: "/users/search",
  change: function() {
    var username = $(this).val();
    if (!username) return;

    window.location = window.location + '?_switch_user=' + username;
  }
});

代码未经测试,可能需要进行一些修改才能使其真正有效。