Ich schreibe eine einzelne Seite Anwendung in React und Redux (mit einem Node.js Backend).Einige React-Komponenten-Children je nach Benutzerrolle ausblenden
Ich möchte rollenbasierte Zugriffskontrolle implementieren und die Anzeige bestimmter Teile (oder Unterteile) der App steuern.
Ich werde von Node.js Berechtigungsliste erhalten, die mit einer solchen Struktur nur ein Objekt ist:
{
users: 'read',
models: 'write',
...
dictionaries: 'none',
}
Schlüssel ist Ressource geschützt,
Wert ist die Benutzerberechtigung für diese Ressource (eines von: none
, read
, write
).
Ich speichere es im Redux-Zustand. Scheint einfach genug.
none
Die Erlaubnis wird von react-router
Routen onEnter/onChange
Haken oder überprüft werden. Es scheint auch einfach zu sein.
Aber was ist der beste Weg, um read/write
Berechtigungen auf alle Komponentenansicht anwenden (z. B. ausblenden Bearbeitungsschaltfläche in der Modellkomponente, wenn der Benutzer { models: 'read' }
Erlaubnis hat).
habe ich this solution und ändern Sie es ein bisschen für meine Aufgabe gefunden:
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)
wo userPermissionsSelector
wäre so etwas wie dieses: (store) => store.userPermisisons
und gibt Objekt Benutzerberechtigung.
wickeln Dann geschützten Element mit Check
:
<Check resource="models" permission="write">
<Button>Edit model</Button>
</Check>
so, wenn der Benutzer nicht write
Berechtigung verfügt, für models
die Schaltfläche wird nicht angezeigt.
Hat jemand so etwas getan? Gibt es mehr "elegante" Lösung als das?
danke!
P.S. Natürlich wird die Benutzerberechtigung auch auf der Serverseite überprüft.
Ich habe so etwas schon einmal gemacht. Ich hatte eine Admin-Seite, die basierend auf dem Benutzer eingeschränkt wurde. Was Sie tun, ist im Grunde, was ich getan habe. Ich benutzte PHP als mein Backend und validierte es durch Überprüfung der PHP-Sitzung (nicht die beste, aber arbeitete mit dem, was ich hatte/wusste). Und es hat die Seite erfolgreich versteckt. Wenn Ihre Lösung funktioniert, würde ich nicht zu viel darüber streiten, obwohl Sie eine 'else'-Anweisung im Rendering haben möchten, nur um etwas wie' Sie haben keinen Zugriff auf diese Seite 'oder etwas, nur so Benutzer zurückzugeben kann etwas sehen, anstatt zu denken, die Seite ist gebrochen –
Vielen Dank, aber "else" Anweisung in diesem Fall ist nicht erforderlich, weil ich einige Aktionssteuerungen wie "Bearbeiten" oder "Löschen" -Schaltflächen in bereits geöffneten Seite ausblenden möchten. –
das ist in Ordnung, wenn Sie etwas tun wie '{exists &&