我正在React和Redux(帶有Node.js後端)中編寫單頁應用程序。根據用戶角色隱藏一些React組件子代
我想實現基於角色的訪問控制,並希望控制應用程序的某些部分(或子部分)的顯示。
我要得到的Node.js,這僅僅是這樣的結構的對象權限列表:
{
users: 'read',
models: 'write',
...
dictionaries: 'none',
}
鍵是受保護的資源,
值是用戶權限對於此資源(以下之一:none
,read
,write
)。
我正在將它存儲到redux狀態。看起來很簡單。
none
權限將被react-router
路由onEnter/onChange
掛鉤或redux-auth-wrapper
檢查。這似乎也很容易。
但是,對任何組件視圖應用read/write
權限(例如,如果用戶具有{ models: 'read' }
權限,請隱藏Models組件中的編輯按鈕)的最佳方式是什麼。
我發現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'語句來返回類似'你無法訪問這個頁面'的東西,這樣用戶可以看到一些東西,而不是認爲頁面已損壞 –
謝謝,但在這種情況下'else'語句不是必需的,因爲我想在已打開的頁面中隱藏一些操作控件,例如「編輯」或「刪除」按鈕。 –
這很好,如果你喜歡'{exists &&