Mein Verständnis zu implementieren ist, dass ich die folgenden Schritte unternehmen müssen:Wie eine rollenbasierte Zugriffskontrolle mit AngularFire
- die Rollen schreibgeschützt auf dem Daten
- Verwenden Sicherheitsregeln der Nutzer machen, die Zugang die Rollen Zugriff auf den Router
- prüfen für die Rolle steuern
Es gibt verschiedene Beispiele auf der offiziellen Dokumentation, wie mit den Sicherheitsregeln umgehen, aber ich konnte nicht herausfinden, ho w nach der Rolle im Router suchen. Nehmen wir an, ich habe einen Admin-Bereich. Wenn jemand, der kein Administrator ist, versucht, auf diese Seite zuzugreifen, möchte ich, dass dieser Benutzer umgeleitet wird.
Ich verfolge derzeit die official example using UI-Router, so ist dies mein Code:
app.config(["$stateProvider", function ($stateProvider) {
$stateProvider
.state("home", {
// the rest is the same for ui-router and ngRoute...
controller: "HomeCtrl",
templateUrl: "views/home.html",
resolve: {
// controller will not be loaded until $waitForSignIn resolves
// Auth refers to our $firebaseAuth wrapper in the factory below
"currentAuth": ["Auth", function(Auth) {
// $waitForSignIn returns a promise so the resolve waits for it to complete
return Auth.$waitForSignIn();
}]
}
})
.state("account", {
// the rest is the same for ui-router and ngRoute...
controller: "AccountCtrl",
templateUrl: "views/account.html",
resolve: {
// controller will not be loaded until $requireSignIn resolves
// Auth refers to our $firebaseAuth wrapper in the factory below
"currentAuth": ["Auth", function(Auth) {
// $requireSignIn returns a promise so the resolve waits for it to complete
// If the promise is rejected, it will throw a $stateChangeError (see above)
return Auth.$requireSignIn();
}]
}
});
}]);
Ich vermute, ich werde für eine Benutzerrolle in der Entschlossenheit überprüfen müssen, aber wie würde ich auf die Daten zugreifen von der Datenbank dort?
Update:
Ich versuchte André-Lösung, aber "waitForAuth" (console.log ("test1") löst nie "waitForSignIn" tut zwar, aber dann passiert nichts - es gibt keine Fehlermeldung..
.state('superadmin-login', {
url: '/superadmin',
templateUrl: 'views/superadmin-login.html',
'waitForAuth': ['Auth', function (Auth) {
console.log('test1');
// $requireAuth returns a promise so the resolve waits for it to complete
// If the promise is rejected, it will throw a $stateChangeError (see above)
return Auth.refAuth().$waitForSignIn();
}],
})
.state('superadmin', {
url: '/center-of-the-universe',
templateUrl: 'views/superadmin.html',
resolve: {
// YOUR RESOLVES GO HERE
// controller will not be loaded until $requireAuth resolves
// Auth refers to our $firebaseAuth wrapper in the example above
'currentAuth': ['Auth', function (Auth) {
console.log('test2');
// $requireAuth returns a promise so the resolve waits for it to complete
// If the promise is rejected, it will throw a $stateChangeError (see above)
return Auth.refAuth().$requireSignIn();
}],
//Here i check if a user has admin rights, note that i pass currentAuth and waitForAuth to this function to make sure those are resolves before this function
hasAdminAccess: function (currentAuth, waitForAuth, Rights) {
console.log('test');
return Rights.hasAdminAccess(currentAuth);
}
}
})
Große Antwort Andre. Können Sie ein Snippet der JSON-Struktur hinzufügen, die Sie für die Berechtigungen verwenden? Und möglicherweise auch die Sicherheitsregeln (denn nur so können Sie sicher sein, dass Ihre Regeln durchgesetzt werden). –
Vielen Dank für Ihre Hilfe André, ich schätze es sehr. Bitte beachten Sie mein Update oben - ich bin mir nicht sicher, ob ich Ihre Lösungen falsch implementiere, weil ich keine abstrakten Zustände verwende? – user3255061
@ user3255061Es hat nichts mit dem abstrakten Zustand zu tun, sondern mit der Tatsache, dass Sie waitForAuth in einem anderen Zustand haben. Sie können es auch in den anderen Status versetzen oder aus der Funktion hasAdminAccess entfernen. Dann sollte es funktionieren. –