【发布时间】:2018-03-12 16:59:26
【问题描述】:
我试图在react 和Meteor 中显示一个管理员仪表板,前提是当前用户是管理员。
我正在调用一个服务器方法来检查用户权限并仅在此方法返回 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 的结果作为道具发送到adminDashboard(adminDashboard 组件仅在其道具为true 时才会显示信息)。
但我确信这是否安全。可以用 Chrome react 开发者工具或类似的东西来改变道具吗?
非常感谢
【问题讨论】:
-
是的,可以在控制台中轻松更改道具。您的方法不是特别安全,但可能足以满足您的需求。
-
很难根据指示管理员角色的布尔标志来制作客户端组件。你肯定需要一个方法对应的所有东西,因为你需要假设有人在客户端伪造了管理员角色
-
我不知道这是否对你有帮助,但通常在我的项目中,我使用redux store 来获取用户的角色,并编写一个从redux store 读取状态的高阶组件并呈现正确的组件,当然 redux devtools 必须仅在开发模式下启用。
-
忘了说非常敏感的区域也可以呈现在服务器端,只有在角色匹配时才能发布仅供管理员使用的数据
-
我不得不补充一点,您不得拥有有关客户的任何敏感信息。根本不信任客户。在您的特定情况下,唯一的 safe 解决方案将是 SSR。所有其他的都将是脆弱的。