我的应用程序具有工作身份验证系统。我的问题是,当用户连接时,他仍然可以通过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
}
});
答案 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');
}
}