authentication - 设置 redux 操作的权限

标签 authentication reactjs permissions redux

我正在创建一个 Web redux-react 应用程序,它将具有许多不同的权限级别。许多用户可能正在与一项数据进行交互,但有些用户的操作可能受到限制。

对我来说,设置数据交互权限(保存在应用程序服务器后面)的明显方法是将某些权限与不同的 redux 操作相关联。然后,当用户保存其状态时,客户端应用程序将捆绑用户的操作历史记录并将其发送回服务器。然后,这些操作可以应用于服务器中的数据,并且可以针对用户 jwt 逐个操作地检查权限。

这意味着我们的许多 reducer 代码可以在服务器上同构使用。

我找不到任何关于此的资源/讨论。在 redux 应用程序中处理复杂权限的正常方法是什么?纯粹在端点进行身份验证似乎很麻烦,这需要重写大量已经在客户端 reducer 中编写的新代码。有什么理由不继续创建一个 reducer 来检查每个操作的身份验证?

积分:

  • 我们必须假设发送到服务器的操作经过身份验证,但发送者没有权限调度这些操作
  • 如果权限已被检查并且在操作中,那么reducer 可以检查权限并且是纯粹的

最佳答案

我认为检查权限不是 Action 创建者的责任,但使用 reducer 和选择器绝对是正确的方法。这是一种可能的实现。

以下组件需要进行一些 ACL 检查:

/**
 * Display a user record.
 * 
 * A deletion link is added if the logged user has sufficient permissions to
 * delete the record.
 */
function UserRecord({ username, email, avatar, isGranted, deleteUser }) {
  return (
    <div>
      <img src={avatar} />
      <b>{username}</b>
      {isGranted("DELETE_USER")
        ? <button onClick={deleteUser}>{"Delete"}</button>
        : null
      }
    </div>
  )
}

我们需要将其连接到我们的商店以正确水化所有 Prop :

export default connect(
  (state) => ({
    isGranted: (perm) => state.loggedUser.permissions.has(perm),
  }),
  {deleteUser},
  (stateProps, dispatchProps, ownProps) => ({
    ...stateProps,
    ...ownProps,
    deleteUser: () => dispatchProps.deleteUser(ownProps.user)
  })
)(UserRecord)
  • connect 的第一个参数将为登录用户创建 isGranted。这部分可以使用reselect来完成,以提高性能。

  • 第二个参数将绑定(bind)操作。这里没什么特别的。

  • 第三个参数将合并所有 Prop 并将它们传递给包装的组件。 deleteUser 绑定(bind)到当前记录。

您现在可以使用 UserRecord 而无需处理 ACL 检查,因为它会根据 loggedUser 中存储的内容自动更新。

<UserRecord user={someUser} />

为了使上述示例正常工作,您需要将登录用户作为 loggedUser 存储在 Redux 的存储中。您不需要检查操作的 ACL,因为如果当前用户缺乏权限,UI 不会触发它们。此外,ACL 必须在服务器端进行检查。

关于authentication - 设置 redux 操作的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35270263/

相关文章:

security - 如何确定用于运行我的网站的安全帐户?

azure - 将 localhost 添加到 Azure AD/应用程序注册重定向 URL 是否存在安全风险?

javascript - 使用 ListView 自动完成 TextInput - 必须点击 ListView 两次才能选择列表项

javascript - 为数据表的所有列构造状态对象以进行排序: React JS

hadoop - distcp - HDFS 文件的访问执行权限错误

database - 如何在 Vaadin 上创建用户身份验证?

python - Python-eve Rest Api 框架中的用户相关资源过滤器

javascript - axios删除调用返回405,我尝试使用id删除节点,但它没有删除

python-3.x - pip install 引发 ERROR 13 Permission denied in conda env

permissions - IBM U2(UniVerse 10.2)-创建模式-方法