AngularJS:转发到登录页面进行身份验证,保留路由作为GET参数
AngularJS: forward to login page for authentication, retain route as GET parameter?
我有点像Angular新手。我正在尝试编写一个Angular服务,它将在任何页面上检查用户是否登录,如果没有,则将其转发到登录页面,将其当前路径作为GET参数传递。
我快到了,但不太管用。我遇到的问题如下:如果用户转到#/articles/my-articles/
,他们就会被转发到#/login/?next=%2Farticles%2F:module%2F
。
换句话说,看起来Angular传递的是路由模式,而不是实际的URL。
这是我的身份验证码:
auth.run(['$rootScope', '$location', '$user', 'TOKEN_AUTH', 'PROJECT_SETTINGS', function ($rootScope, $location, $user, TOKEN_AUTH, PROJECT_SETTINGS) {
var MODULE_SETTINGS = angular.extend({}, TOKEN_AUTH, PROJECT_SETTINGS.TOKEN_AUTH);
$rootScope.$on('$routeChangeStart', function (e, next, current) {
if (next.$$route && !next.$$route.anonymous && !$user.authenticated) {
var nextParam = next.$$route.originalPath;
$location.url(MODULE_SETTINGS.LOGIN + '?next=' + nextParam);
}
});
}]);
我可以使用current.params.module
以一种巧妙的方式获得原始路径,但这对我没有帮助,因为似乎routeChangeStart
被激发了好几次,而除了最后一次激发之外,所有的current
对象都是未定义的。
这是我的路线文件:
articles.config(['$routeProvider', function ($routeProvider) {
$routeProvider
.when('/articles/:module/', {
templateUrl: 'views/articles/article_list.html',
controller: 'ArticlesListCtrl'
})
.when('/articles/:module/:id/', {
templateUrl: 'views/articles/article_detail.html',
controller: 'ArticlesDetailCtrl'
});
}]);
如何解决此问题?
auth.run(['$rootScope', '$location', '$user', 'TOKEN_AUTH', 'PROJECT_SETTINGS', function ($rootScope, $location, $user, TOKEN_AUTH, PROJECT_SETTINGS) {
var MODULE_SETTINGS = angular.extend({}, TOKEN_AUTH, PROJECT_SETTINGS.TOKEN_AUTH);
$rootScope.$on('$routeChangeStart', function (e, next, current) {
if (!$user.authenticated) {
$location.url(MODULE_SETTINGS.LOGIN + '?next=' + $location.path());
$location.replace();
}
});
}]);
如果登录不是AngularJS视图,则可能需要提供otherwise
路由:
(取决于您的$locationProvider配置)
$routeProvider.otherwise({
template: 'Redirecting…',
controller : 'Redirect'
});
...
articles.controller('Redirect', ['$location', function($location) {
if (someConditionThatChecksIfUrlIsPartOfApp) {
location.href = $location.path();
return;
} else {
// Show 404
}
}]);
附带说明:您不应该读取以$$
为前缀的属性,它们是私有的AngularJS变量
另外请注意:不要在您自己的代码中使用$
前缀($user
),这些是为AngularJS保留的公共属性。
我的解决方案适用于Angular 1.2.13:preventDefault停止角度路由,$window.location将我发送到登录页面。这是在ASP.NET MVC+Angular应用程序上运行的。
$rootScope.$on("$locationChangeStart", function (event, next, current) {
event.preventDefault();
$window.location = '/Login';
}
});
相关文章:
- 分派点击事件并保留击键修饰符
- Emberjs应用程序加载在除Index之外的所有路由上
- 正在使用$location.path(.)路由ng视图
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- 如何使用jquery强制一个单词更改大小写等以保留品牌
- 提交后保留下拉选择的值
- 刷新后保留对网页的更改
- 在mvc应用程序中,在回发时保留最初隐藏的文本框的隐藏或可见状态
- Flash Uploadify在调用我的MVC控制器时没有保留会话/授权
- 当设置addFromAutocompleteOnly时,剩余文本将保留在输入字段中
- 未激发路由的控制器属性上的观察者
- 使用递归属性迭代保留属性结构
- AngularJS ui路由器html5模式中断路由
- Jquery html() 和保留元素名称
- 如何将字符串拆分为字符,但在javascript中保留空格
- AngularJS:转发到登录页面进行身份验证,保留路由作为GET参数
- 如何在角度 JS 路由中保留模板视图
- 在访问Angular 2应用的路由时,如何在URL中保留查询字符串参数
- 在ember路由中对模型使用哈希时,不保留模型对象
- 在 AngularJS 中保留路由更改时的滚动位置