Ich habe eine eckige App, die Autorisierungslogik und UI-Router verwendet, um nicht autorisierte Benutzer für bestimmte Status/Ansichten zu sperren. Ich folge dem Standardansatz, auf ein stateChange-Ereignis zu warten, das meine Berechtigungslogik auslöst. Dies alles funktioniert gut, bis die gefürchtete Seite neu geladen wird.So verzögern Sie ein StateChangeStart-Ereignis, bis eine Auflösung des UI-Routers ausgeführt wird
Ich speichere Sitzungsdaten (einschließlich Genehmigungsstatus) im lokalen Speicher, so dass auf Seite neu geladen ich einen übergeordneten Zustand in ui-Router zum ersten resolve verwenden kann/erhalte den Berechtigungsstatus aus dem lokalen Speicher vor dem Versuch Ansichten zu ändern. Hier ist die Konfiguration meines app
Mutterstatusobjekt:
$stateProvider.
state('app', {
url: '/app',
abstract: true,
controller: 'appCtrl',
data: {
authorizedRoles: [USER_ROLES.all]
},
templateUrl: 'partials/app.html',
resolve: {
//Try to restore from the previous session before loading any of the app child states
RestoredSession: ['SessionService',
function(SessionService){
return SessionService.restoreSession();
}]
}
})
...various app. child states
Und hier ist mein OnStateChange Zuhörer:
//listen for a ui.router $stateChangeStart event and test the new path to see if the currentUser
//is authorized to view that page
.run( ['$rootScope', 'AUTH_EVENTS', 'SessionService',
function ($rootScope, AUTH_EVENTS, SessionService) {
$rootScope.$on('$stateChangeStart', function (event, next) {
var authorizedRoles = next.data.authorizedRoles;
//If the requested page allows guest access, then continue to stateChange
if (authorizedRoles.indexOf('guest') !== -1 || authorizedRoles.indexOf('*') !== -1) return;
//If the requested page requires authorization, check login and auth privileges
if (!SessionService.isAuthorized(authorizedRoles)) {
event.preventDefault();
if (SessionService.existingSession()) {
// user is not allowed
$rootScope.$broadcast(AUTH_EVENTS.notAuthorized);
console.log("User attempted to access page for which he is not authorized");
} else {
// user is not logged in
$rootScope.$broadcast(AUTH_EVENTS.notLoggedIn);
console.log("User attempted to access page when he is not logged in");
}
}
});
}]);
Mein Problem ist, dass das stateChangeStart
Ereignis auslöst, bevor die app resolve
, so dass die Zuhörer Anschläge der Statuswechsel (über die event.preventDefault
), und dann lädt meine Lösung die gespeicherten Sitzungsdaten, die oft feststellen, dass der Benutzer die ganze Zeit autorisiert wurde. Wenn ich die Ausführung des Beschlusses vor der Auslösung des Ereignisses verlangen könnte, wäre ich golden.
Irgendwelche Ideen da draußen ???
BTW, ist hier eine ähnliche Frage SO, die unbeantwortet ging: Defer Angular UI Router $stateChangeStart until server authorization response receieved
Diese Antwort kann helfen: http://stackoverflow.com/a/21098923/1873485 – TheSharpieOne