我将 angularjs 与 ui-router 库一起使用。假设我有一些管理员路线和一些用户路线。如果管理员或用户已登录,我想为他们显示一些页面(例如,admin.html 为管理员,user.html 为用户),否则为 login.html
在后端,我有一个特殊的 url,比如 /auth/status/,它提供了有关用户的信息(如果他已登录以及他的角色)
有一些情况我不知道如何处理:
我去'/'网址。应用程序加载。我的应用程序模块有一个运行方法。但是,当异步发生时,如何检查用户是否已登录?好吧,我有这个并且它以某种方式工作,但我不确定这是否是一个好的解决方案:
app.config(['$stateProvider', '$routeProvider',
function($stateProvider, $routeProvider) {
$stateProvider
.state('admin', {
abstract: true,
url: '/',
templateUrl: 'templates/admin.html'
})
.state('admin.desktop', {
url: 'desktop',
templateUrl: 'templates/desktop.html'
});
}]);
app.run([
'$http',
'$rootScope',
'$location',
'$state',
'userRoles',
function($http, $rootScope, $location, $state, userRoles) {
var DEFAULT_ADMIN_STATE = 'admin.desktop';
var promise = $http.get('/auth/status/');
promise.then(function(response) {
$rootScope.isLogged = response.data.logged;
$rootScope.userRole = userRoles[response.data.role];
if (!$rootScope.isLogged) {
$state.transitionTo('login');
} else {
switch (response.data.role) {
case 'admin': $state.transitionTo(DEFAULT_ADMIN_STATE); break;
}
}
}, function(response) {
$location.path('/login');
});
}]);
虽然我不明白:如果我去 / url 我应该得到一个错误,因为它是抽象的。相反,当 $http.get 请求得到解决时(我在后端放置了 2 秒睡眠来检查)我转换到 admin.desktop 状态。我很困惑按什么顺序发生了什么:状态加载模板或带有一些ajax请求的app.run函数......
主要问题是,当我转到 /#/desktop 时,如何首先检查用户是否已登录(向 /admin/auth/ 发送请求并检查它返回的内容),然后才决定要做什么(过渡到登录或桌面状态)?我发现延迟 AngularJS 路由更改直到模型加载以防止闪烁这个,但对我来说还是有点模糊。当我想加载实体列表然后显示模板时,解析属性似乎是一种解决方案。但是我想为所有状态提供一些“之前”功能,它只检查用户是否已登录并具有相应的角色(有一刻:我不想使用 /admin/entites 或 /user/entities url,只想/entitites。据我所知,几个州可能有相同的网址)。所以基本上看起来如果我去 /someurl 我想运行方法等到它得到 ajax 响应,然后转换到某个状态。相反,与 /someurl 对应的状态会加载模板...
我还发现了一篇关于角度身份验证的文章,但作者使用了不是异步的 cookie
更新:当我使用 cookie 检查用户是否已登录并转到 /#/desktop 时,我仍然呈现它,并且 $state.transitionTo 不起作用..