如果已经使用angularjs登录,如何避免显示登录页面?

时间:2014-05-26 19:47:05

标签: javascript angularjs

我正在使用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( "/" );
        } );
    };
}] );

2 个答案:

答案 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 ()行之前)

这似乎工作得很好,但我不知道这样做是不是很糟糕呢?