我正在使用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 组件中隐藏编辑按钮,如果用户具有 { models: 'read' }
权限)?
我找到了这个解决方案并进行了一些修改以适应我的任务:
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>
因此,如果用户没有对models
的write
权限,则该按钮将不会显示。
有人做过类似的事情吗?是否有比这更“优雅”的解决方案?
谢谢!
P.S. 当然,服务器端也会检查用户权限。
else
语句,以返回一些提示,例如“您没有访问此页面的权限”之类的内容,这样用户就可以看到一些东西,而不是认为页面已经崩溃了。 - A. Lelse
语句,因为我想隐藏一些操作控件,如“编辑”或“删除”按钮,在已经打开的页面中。 - Anton Novik{ exists && <div> some stuff </div> }
,并且exists是falsey,那么这个div将不存在(不仅仅是display: none
)。 - A. L