$ routeProvider中的条件表达式

时间:2016-12-12 08:32:22

标签: angularjs session authentication angular-routing

我的应用程序具有工作身份验证系统。我的问题是,当用户连接时,他仍然可以通过URL访问登录页面。我想将所有连接的用户重定向到主页而不是登录页面。

所以,当有人要求/authentication/login

  • 如果用户已连接,他将被重定向到/home
  • 如果没有人连接,则authentication/login的访问权限已打开。

以下是我的实际工作代码(不会将已连接的用户重定向到主页)。

angular.module('authentication').config(RouteConfig);
RouteConfig.$inject = ['$routeProvider', 'UserSession'];

function RouteConfig($routeProvider, UserSession) {
    $routeProvider.when('/authentication/login/', {
        templateUrl: 'section/authentication/login.tmpl',
        controller: 'LoginController',
        controllerAs: 'lo'
    });
}

可以在上面的代码中添加条件语句吗? 类似的东西:

$routeProvider.when('/authentication/login/', {
    if(UserSession.getUser() != null) {
        // Go to Home page instead
    } else {
        // Normal way
    }
});

4 个答案:

答案 0 :(得分:2)

你可以使用它。

  $routeProvider.when('$routeProvider.',
    {
      redirectTo: function (routeParams, path, search) {
        console.log(routeParams);
        console.log(path);
        console.log(search);
        return "/";
      }
    })

尝试在return语句中有条件地返回home路由。 有关详细信息,请参阅$routeProvider文档中的redirectTo或查看此处Thinkster

答案 1 :(得分:2)

您可以将以下代码理解为:

  

在每次路线更改时,"如果已连接的用户想要访问   /authentication/login/,然后他将重定向到/home"。

angular.module('authentication').run(function($rootScope, $location, Session) {
    $rootScope.$on("$routeChangeStart", function(event, next, current) {
        if(Session.getUser() != null && next.$$route.originalPath == '/authentication/login/') {
            $location.path("/home");
        }
    });
});

此解决方案受@st.never's answer on this question启发。

答案 2 :(得分:1)

你可以像这样做条件语句。

angular.module('authentication').config(RouteConfig);
RouteConfig.$inject = ['$routeProvider', 'UserSession'];

function RouteConfig($routeProvider, UserSession) {
 $routeProvider.when('/authentication/login/', {
    templateUrl: 'section/authentication/login.tmpl',
    controller: 'LoginController',
    controllerAs: 'lo',
    resolve: {
      factory: checkRouting
    }
 });
}


var checkRouting= function ($q, $rootScope, $location) {
  if ($rootScope.userProfile) {
    return true;
  } else {
    var deferred = $q.defer();
    $http.post("/yourUrl",data)
        .success(function (response) {
            $location.path("/login");
            deferred.resolve(true);
        })
        .error(function () {
            deferred.reject();
            $location.path("/home");
         });
    return deferred.promise;
  }
 };

答案 3 :(得分:0)

我的一个Angular应用程序中有一个非常相似的方法。在路线的配置中,您可以添加任何您喜欢的密钥,并使用$routeParams服务访问这些密钥。

所以对你的例子来说:

function RouteConfig($routeProvider, UserSession) {
    $routeProvider.when('/authentication/login/', {
        templateUrl: 'section/authentication/login.tmpl',
        controller: 'LoginController',
        controllerAs: 'lo',
        blockAuthenticated: true // <-- add a new flag, something like this 
    });
}

然后在您的应用程序中的其他位置最合适,例如module.run()

function run($location, $routeParams, UserSession)
{
    // redirect the user home if they're logged in and the route doesn't allow
    // authed users

    if ($routeParams.blockAuthenticated && UserSession.getUser() != null) {
        $location.path('/home');
    }
}