我正在使用AngularJS构建应用程序。我有身份验证工作,当用户未获得授权时,他会被重定向到显示登录表单的#/login
。
但是,当用户通过身份验证并手动转到#/login
时,会再次显示登录页面,尽管用户仍然已登录。在这种情况下,有没有办法将他指向主页?
这就是我重定向的方式:
$routeProvider
.when( '/ds', {
templateUrl: 'partials/datasheets-list.html',
controller: 'DatasheetsListCtrl'
} )
.when( '/ds/:datasheetId', {
templateUrl: 'partials/datasheet-detail.html',
controller: 'DatasheetDetailCtrl'
} )
.when( '/login', {
templateUrl: 'partials/login.html',
controller: 'LoginController'
} )
.otherwise( {
redirectTo: '/ds'
} );
这是LoginController
:
var datasheetsControllers = angular.module( 'datasheetsControllers', ['ngCookies', 'datasheetsServices'] );
datasheetsControllers.controller( 'LoginController', ['$scope', '$rootScope', '$location', '$http', '$cookieStore', 'LoginService', function ( $scope, $rootScope, $location, $http, $cookieStore, LoginService )
{
$scope.login = function ()
{
LoginService.authenticate( $.param( {username: $scope.username, password: $scope.password} ), function ( user )
{
$rootScope.user = user;
// Authenticate AngularJS Ajax calls
$http.defaults.headers.common[ xAuthTokenHeaderName ] = user.token;
// Authenticate jQuery Ajax calls
var headers = {};
headers[xAuthTokenHeaderName] = user.token;
$.ajaxSetup({
headers: headers
});
$cookieStore.put( 'user', user );
$location.path( "/" );
} );
};
}] );
答案 0 :(得分:3)
我认为通常的做法是听取$routeChangeStart
事件。
$scope.$on('$routeChangeStart', function(scope, next, current){
//...
});
在这里你可以询问下一个路径是否登录,然后你可以检查auth服务,如果用户已经登录。如果是,请像往常一样使用重定向将他直接重定向到登录
另外,您可以在路径对象中使用resolve
回调
when('/login', { controller: 'LoginCtrl', templateUrl: '', resolve : {
load : function ( ... ) { ... }
})
SO上已有类似的东西
AngularJS - Need some combination of $routeChangeStart and $locationChangeStart
Fire a callback when route is changed (animations, loaders etc) in AngularJS
答案 1 :(得分:0)
我设法通过简单地将其添加到LoginController
:
if( $rootScope.user )
{
$location.path( "/" );
}
(就在$scope.login = function ()
行之前)
这似乎工作得很好,但我不知道这样做是不是很糟糕呢?