dasboe: Myślę, że odpowiadam na twoje pytanie.
Mam aplikację z sprawdzaniem autentyczności/autoryzacji w module obsługi zdarzeń $ routeChangeStart. Jeśli nie zostanie uwierzytelniony, przedstawiam użytkownikowi stronę logowania modalnego. Chcę udanego logowania, aby wysłać je do ich pierwotnego miejsca docelowego (Beauty of $ routeChangeStart oznacza, że uruchomi się ponownie i sprawdzi autoryzację po pomyślnym zalogowaniu). Zapisuję ścieżkę zbudowaną od następnej w usłudze sesji użytkownika, która jest wstrzykiwana do modalnego kontrolera logowania.
oto obsługi zdarzeń
//before each route change, check if the user is logged in
//and authorized to move onto the next route
$rootScope.$on('$routeChangeStart', function (event, next, prev) {
if (next !== undefined) {
if ('data' in next) {
if ('authorizedRoles' in next.data) {
var authorizedRoles = next.data.authorizedRoles;
if (!SessionService.isAuthorized(authorizedRoles)) {
event.preventDefault();
SessionService.setRedirectOnLogin(BuildPathFromRoute(next));
if (SessionService.isLoggedIn()) {
// user is not allowed
$rootScope.$broadcast(AUTH_EVENTS.notAuthorized);
} else {
// user is not logged in
$rootScope.$broadcast(AUTH_EVENTS.notAuthenticated);
}
}
}
}
}
});
Oto funkcja, która buduje ścieżkę od następnego obiektu
function BuildPathFromRoute(routeObj)
{
var path = routeObj.$$route.originalPath;
for (var property in routeObj.pathParams)
{
if (routeObj.pathParams.hasOwnProperty(property))
{
var regEx = new RegExp(":" + property, "gi");
path = path.replace(regEx, routeObj.pathParams[property].toString());
}
}
return path;
}
Uwagi:
- Nie jestem zapalonym na moim zaufaniu na trasie $$, ale nie mogłem znaleźć innego sposobu na to. Może tęskniłem za czymś łatwiejszym. Mogę zapraszać kłopoty na dłuższą metę.
- Funkcja preventDefault() nie będzie działać w wersjach AngularJS przed wersją 1.3.7 (patrz event.preventDefault() not working for routeChangeStart in angularjs app).
- Standardowe zastrzeżenie: jest to strona klienta i może być przedmiotem nadużycia. Upewnij się, że uwierzytelnienie/autoryzacja ma miejsce po stronie serwera.
- Następny obiekt trasy (z obsługi zdarzeń) ma również właściwość params. Nie jestem pewien, czy powinienem przerzucać jego właściwości, tak jak robię pathParams.
zajrzyj na http://stackoverflow.com/questions/11541695/redirecting-to-a-certain-route-based-on-condition – stackg91
Dzięki. Widziałem to już wcześniej, ale nie sądzę, że pomoże to w moim konkretnym problemie. – dasboe