【问题标题】:How do I securely save a variable not affected by render?如何安全地保存不受渲染影响的变量?
【发布时间】:2021-05-21 22:29:10
【问题描述】:

我正在尝试将用户集合中的变量保存到客户端,以便我可以使用它,但我不希望客户端能够更改该变量。我如何做到这一点?

目前我有这个,但它一直在打开和关闭,因为它在渲染时并不总是从集合中获取变量:

function AdminMenu() {
    const user = useTracker(() => Meteor.user());
    
    if (user.admin) {
        return (
            <div>isAdmin</div>
        );
    } else {
        return (<div/>);
    }
}

我可以让它按照我想要的方式工作,但我担心客户端能够编辑变量:

let isAdmin = false;

function AdminMenu() {
    const user = useTracker(() => Meteor.user());
    
    if (user.admin) {
        isAdmin = true;
    }
    
    if (isAdmin) {
        return (
            <div>isAdmin</div>
        );
    } else {
        return (<div/>);
    }
}

实现这一目标的最佳方法是什么? 提前致谢!

【问题讨论】:

  • 客户端的本质是它不安全,因此始终可以编辑变量。重要的是您只信任在服务器上执行的代码,从不信任客户端提供的未经验证的数据。至于变量切换,这是因为订阅还没有准备好。一般来说,您需要等待您的数据所依赖的任何订阅准备就绪,然后再渲染依赖该数据的组件部分。
  • 啊,是的,所以我在服务器上创建了一个方法来检查用户是否是管理员。这就说得通了。感谢您的信息!
  • 嗯,我似乎无法让它工作,因为调用方法有延迟,但目前我只将 user.admin 发送给具有价值和订阅的用户.ready() 函数似乎可以工作。客户端是否能够更改用户集合的值或添加到用户集合中?
  • 可以从订阅句柄中获取就绪状态。
  • 如果您愿意,请随时访问 Meteor Community Slack 工作区,我们可以讨论解决此问题的更多策略meteor-community.slack.com/join/shared_invite/…

标签: reactjs meteor


【解决方案1】:

更改的原因是组件第一次渲染时订阅还没有准备好,但是一旦准备好,tracker 将导致模板重新渲染并显示新状态。要解决此问题,您需要在使用跟踪器挂钩中进行订阅,并且仅在订阅准备好后才呈现。试试这个。

function AdminMenu() {
  const { user, ready } = useTracker(() => ({
    user: Meteor.user(),
    ready: Meteor.subscribe('your-subscription-name').ready();
  }));
  
  if (ready && user.admin) {
      return (
          <div>isAdmin</div>
      );
  } else {
      return (<div/>);
  }
}

还有另一种处理这个问题的方法有点复杂,所以我不会在这里详细说明,但请参阅我上面的评论并加入 Meteor Community Slack,如果出现以下情况,我非常乐意为您提供进一步帮助你喜欢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多