javascript - (ui-)router 中的 Angular-app、身份验证和解析器顺序

标签 javascript angularjs authentication angular-ui-router

这个问题是指angular-app项目及其对用户进行身份验证的方式。

最初的实现通过在路由器上使用 resolve 子句来保护对某些 url 的访问。这看起来像:

$routeProvider.when('/projects', {
templateUrl:'projects/projects-list.tpl.html',
controller:'ProjectsViewCtrl',
resolve:{
  projects:['Projects', function (Projects) {
    //TODO: fetch only for the current user
    return Projects.all();
  }],
  authenticatedUser: securityAuthorizationProvider.requireAuthenticatedUser
}

});

在用户通过身份验证并获取项目(以防止 ui 闪烁)之前,不会呈现 View 。如果用户未通过身份验证,则会弹出登录弹出窗口,在用户提交后, promise 将得到解决并显示请求的页面。如果 Projects.all() 调用不需要身份验证,这会很好用。

这是服务器调用的日志:

127.0.0.1 - - [Mon, 28 Oct 2013 11:15:47 GMT] "GET /projects HTTP/1.1" 200 739 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
Unauthenticated
127.0.0.1 - - [Mon, 28 Oct 2013 11:15:47 GMT] "GET /current-user HTTP/1.1" 200 24 "http://localhost:3000/projects" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
Unauthenticated
Unauthenticated
127.0.0.1 - - [Mon, 28 Oct 2013 11:15:47 GMT] "GET /current-user HTTP/1.1" 200 24 "http://localhost:3000/projects" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
127.0.0.1 - - [Mon, 28 Oct 2013 11:15:47 GMT] "GET /databases/angular_app/collections/projects?q=%7B%7D HTTP/1.1" 200 10 "http://localhost:3000/projects" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"
Unauthenticated
127.0.0.1 - - [Mon, 28 Oct 2013 11:15:59 GMT] "POST /login HTTP/1.1" 200 161 "http://localhost:3000/projects" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0"

对 angular_app/collections/projects 的调用即使对于未经身份验证的用户也是有效的。

在我的例子中,我有以下代码:

$stateProvider
    .state('root.tickets', {
        url: '/tickets',
        views: {
            'container@': {
                templateUrl: 'tickets/tickets-list.tpl.html',
                controller:'TicketsViewCtrl',
                resolve:{
                  ticketsy: ['Restangular', function (Restangular) {
                    //Call to tickets must be authenticated
                    return Restangular.all('tickets').getList();
                  }],
                  authenticatedUser: securityAuthorizationProvider.requireAuthenticatedUser
                }
            }
        }

不同之处在于(除了我使用 ui-router 和 Restangular)api 调用必须经过身份验证。服务器日志如下所示:

[28/Oct/2013 05:50:15] "GET /api/tickets/ HTTP/1.1" 403 59
[28/Oct/2013 05:50:15] "GET / HTTP/1.1" 200 963
[28/Oct/2013 05:50:16] "GET /api/current-user/ HTTP/1.1" 200 14
[28/Oct/2013 05:50:16] "GET /api/tickets HTTP/1.1" 301 0
[28/Oct/2013 05:50:16] "GET /api/tickets/ HTTP/1.1" 403 59
[28/Oct/2013 05:50:22] "POST /api/login/ HTTP/1.1" 200 120

注意这里的 403 状态码。结果是用户看到登录弹出窗口,进行身份验证但随后看到空白页面。我想这是因为数据获取 promise 失败。

我的问题是 - 是否有可能以某种方式强制 promise 的顺序?我想先检查用户是否经过身份验证,然后向后端发出调用等。或者我可以在这里使用其他解决方案吗?我正在学习 Angular,所以即使有一个简单的解决方案对我来说也不是显而易见的。

最佳答案

我喜欢使用解析器模式,但发现很难在 Angular UI 路由器中执行这些类型的操作。

一个解决方案是将 authenticatedUser 解析器的结果依赖注入(inject)到您想要保护的 api 调用解析器中,例如:

$stateProvider
    .state('root.tickets', {
        url: '/tickets',
        views: {
            'container@': {
                templateUrl: 'tickets/tickets-list.tpl.html',
                controller:'TicketsViewCtrl',
                resolve:{
                  authenticatedUser: securityAuthorizationProvider.requireAuthenticatedUser,
                  ticketsy: function (Restangular, authenticatedUser) {
                    //Call to tickets must be authenticated
                    return Restangular.all('tickets').getList();
                  }
                }
            }
        }

这样解析器将在链中运行(authenticatedUser -> ticketsy)而不是一次异步。

我希望这对您有所帮助..希望有更好的方法来做到这一点..这就是我搜索堆栈溢出的原因。

关于javascript - (ui-)router 中的 Angular-app、身份验证和解析器顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19633677/

相关文章:

javascript - Angular,用两个点设置范围变量

java - 我如何使用 Spring MVC 处理用户登录?

php - 第二个标记未放置在谷歌地图中

javascript - 使用 Blade 模板无法进行验证

javascript - 单击 ng-dialog 中的按钮不起作用

authentication - 将 FaunaDB 客户端 secret 存储在 cookie 中安全吗?

ios - cordova ios 中的基本身份验证失败

javascript - 如何为函数编写单元测试?

php - 是否有任何代码库可以验证/将博客评论转换为严格的 XHTML?

javascript - Angular UI Grid - 选定行上的单击事件