Angular/Express: перенаправление на последнюю страницу, посещенную после входа в систему

Подобный вопрос здесь (но не применимый).

В моем SPA я использую PassportJS для обработки аутентификации. У меня есть много маршрутов, которые требуют, чтобы пользователь вошел в систему. Я маршрутизирую так:

// ... other routing stuff
when('/insights', {
    templateUrl: 'partials/insights',
    controller: 'insightsCtrl',
    resolve: { 
        loggedin: checkLoggedin 
    }
})

var checkLoggedin = function($q, $timeout, $http, $location, $rootScope){ 
  var deferred = $q.defer(); 
  $http.get('/loggedin').success(function(user){ 
    if (user !== '0') {
        $rootScope.user = user;
        deferred.resolve(); 
    }
    else { 
      deferred.reject(); 
      $location.url('/login'); 
    } 
  }); 
return deferred.promise; 
};

Мой маршрут, чтобы проверить, если вошли в систему:

app.get('/loggedin', function(req, res) {
    res.send(req.isAuthenticated() ? req.user : '0');
});

Если они не вошли в систему, они перенаправлены на /login, Как только это будет успешно сделано, я бы хотел вернуться к исходной странице, которую они пытались запросить.

Существует ли встроенный способ хранения маршрута, к которому пользователь пытается получить доступ, чтобы я мог перенаправить его после входа в систему? Полагаю, я могу сделать это с печеньем, но это немного неуклюже...

2 ответа

Решение

Вы можете использовать пользовательский обратный вызов, как описано в документации по passportjs. С помощью пользовательского обратного вызова вы можете отправить текущую строку запроса на ваш сервер и получить перенаправление на ту же строку запроса после успешного входа в систему.

Другая возможность - использовать localStorage для сохранения текущего состояния и получения его после входа в систему. У вас есть много модулей, чтобы использовать localStorage с angular, как https://github.com/grevory/angular-local-storage.

Нет встроенного подхода, кроме использования пользовательского обратного вызова, который предоставляет PassportJS, но если вы пишете это для SPA, вы можете использовать $cacheFactory и создайте сервис / фабрику, которая хранит страницу последнего посещения этого пользователя.

Ограничения для $ cacheFactory те же, что и для локального хранилища: они зависят от домена, поэтому при смене доменов локальное хранилище не будет таким же междоменным.

Другие вопросы по тегам