【发布时间】:2017-07-22 21:30:40
【问题描述】:
我正在用 React 和 Redux 编写一个单页应用程序(带有 Node.js 后端)。
我想实现基于角色的访问控制,并想控制应用的某些部分(或子部分)的显示。
我要从 Node.js 获取权限列表,它只是一个具有这种结构的对象:
{
users: 'read',
models: 'write',
...
dictionaries: 'none',
}
key是受保护的资源,
value 是此资源的用户权限(其中之一:none、read、write)。
我将它存储到 redux 状态。看起来很简单。
none 权限将由react-router 路由onEnter/onChange 钩子或redux-auth-wrapper 检查。看起来也很简单。
但是将read/write 权限应用于任何组件视图的最佳方式是什么(例如,如果用户拥有{ models: 'read' } 权限,则隐藏模型组件中的编辑按钮)。
我找到了this solution 并根据我的任务对其进行了一些更改:
class Check extends React.Component {
static propTypes = {
resource: React.PropTypes.string.isRequired,
permission: React.PropTypes.oneOf(['read', 'write']),
userPermissions: React.PropTypes.object,
};
// Checks that user permission for resource is the same or greater than required
allowed() {
const permissions = ['read', 'write'];
const { permission, userPermissions } = this.props;
const userPermission = userPermissions[resource] || 'none';
return permissions.indexOf(userPermission) >= permissions.indexOf(permission)
}
render() {
if (this.allowed()) return { this.props.children };
}
}
export default connect(userPermissionsSelector)(Check)
userPermissionsSelector 会是这样的:(store) => store.userPermisisons 并返回用户权限对象。
然后用Check包裹受保护的元素:
<Check resource="models" permission="write">
<Button>Edit model</Button>
</Check>
因此,如果用户没有write 的models 权限,则不会显示该按钮。
有人做过这样的事吗?还有比这更“优雅”的解决方案吗?
谢谢!
P.S.当然也会在服务器端检查用户权限。
【问题讨论】:
-
我以前做过类似的事情。我有一个基于用户限制的管理页面。你所做的基本上就是我所做的。我使用 php 作为我的后端,并通过检查 PHP 会话来验证它(不是最好的,但可以使用我所拥有的/知道的)。它成功地隐藏了页面。如果您的解决方案有效,那么我不会对此大惊小怪,尽管您可能希望在渲染中使用
else语句来返回类似you do not have access to this page或其他内容,以便用户可以看到某些内容,而不是思考页面坏了 -
谢谢,但在这种情况下不需要
else声明,因为我想在已经打开的页面中隐藏一些操作控件,例如“编辑”或“删除”按钮。 -
没关系,如果您执行
{ exists && <div> some stuff </div> }之类的操作并且存在是错误的,那么 div 将不存在(不仅仅是display: none) -
嘿...你找到这个解决方案的任何在线资源了吗?
-
嗨,我没有
标签: reactjs permissions redux roles