【问题标题】:React : How to safely display a component according to user roleReact:如何根据用户角色安全地显示组件
【发布时间】:2018-03-12 16:59:26
【问题描述】:

我试图在reactMeteor 中显示一个管理员仪表板,前提是当前用户是管理员

我正在调用一个服务器方法来检查用户权限并仅在此方法返回 true 时才呈现管理组件。

这个服务器调用是异步的,因此组件没有渲染,通常我用状态管理这个异步调用,但我不想在这里暴露任何状态(不希望有人改变状态并访问管理仪表板)。

代码如下:

export default class AdminChecker extends Component {
  isItAdmin() {
    // Get the id of current user
    const userId = Meteor.userId();
    if (userId) {
      // call a server method which returns true if current user is Admin
      Meteor.call('checkAdminId', userId, (err, authorized) => {
        if (err) {
          console.log(err);
          return null;
        }
        return (authorized) ? <AdminDashboard /> : null;
      });
    }
  }
  render() {
    return (
      <div className="admin-temp-container">
        {this.isItAdmin()}
      </div>
    );
  }
}

我认为我可以在父组件中包含此逻辑并将isItAdmin 的结果作为道具发送到adminDashboardadminDashboard 组件仅在其道具为true 时才会显示信息)。

但我确信这是否安全。可以用 Chrome react 开发者工具或类似的东西来改变道具吗?

非常感谢

【问题讨论】:

  • 是的,可以在控制台中轻松更改道具。您的方法不是特别安全,但可能足以满足您的需求。
  • 很难根据指示管理员角色的布尔标志来制作客户端组件。你肯定需要一个方法对应的所有东西,因为你需要假设有人在客户端伪造了管理员角色
  • 我不知道这是否对你有帮助,但通常在我的项目中,我使用redux store 来获取用户的角色,并编写一个从redux store 读取状态的高阶组件并呈现正确的组件,当然 redux devtools 必须仅在开发模式下启用。
  • 忘了说非常敏感的区域也可以呈现在服务器端,只有在角色匹配时才能发布仅供管理员使用的数据
  • 我不得不补充一点,您不得拥有有关客户的任何敏感信息。根本信任客户。在您的特定情况下,唯一的 safe 解决方案将是 SSR。所有其他的都将是脆弱的。

标签: reactjs meteor


【解决方案1】:

我认为这有两个部分(并且 cmets 暗示了这两个部分):

首先,您不应该期望能够在客户端上实施安全性。您必须在服务器上实现访问控制逻辑(即,任何执行管理员操作的 API 都必须检查执行该操作的用户是管理员)。

一旦你这样做了(也许你已经这样做了),那么你可能需要使用 props 或 state 来存储用户是否是管理员(就像你在应用中存储任何其他数据一样)。

关键点是,一旦你在服务器上实施了安全措施,那么用户是否操纵状态来访问管理仪表板就无关紧要了:服务器不会让用户查看任何真实数据或获取任何数据无论如何都要行动。

这与服务器端渲染完全无关。只要用于获取管理数据和执行管理操作的 API 实现了它们自己的访问控制检查,您当然可以构建一个安全的管理仪表板而无需服务器端呈现。

【讨论】:

  • 我完全同意你的观点,但问题本身不是关于实施服务器端检查或类似的东西。问题是“根据用户的角色在 client 上显示/隐藏 UI 组件 是否安全”。对于,我的回答是“信任客户是永远安全的”。对于这个特定问题,唯一安全的解决方案是 SSR。
  • 我想我可以看到 SSR 在获取数据以填充管理仪表板时被用作访问控制的解决方法。但是调用 API 来采取行动呢?我想您将无法使用 AJAX...您需要使用 HTML 表单或其他东西。
  • 即使你做了所有这些来实现客户端访问控制,你仍然有一个问题,你有一个允许任意用户执行管理操作的服务。然后,您将自己暴露在各种漏洞中。例如,您需要阻止对服务的 Internet 访问(以防有人发现 API)。但即便如此,您环境中任何地方的任意代码执行漏洞都会授予对这些管理功能的访问权限。
  • (漏洞列表还在继续,但这些 cmets 太短,无法全部列出...)
  • 您为什么认为 SSR 应该是 API 中控制检查的替代?这两件事不是排他的。当然,API 应该控制检查,但问题本身与此无关。
猜你喜欢
  • 2021-11-09
  • 2018-04-21
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
相关资源
最近更新 更多