此问题涉及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闪烁),才会渲染视图。如果用户未通过身份验证,则将弹出登录弹出窗口,在用户提交后,将解决承诺并显示请求的页面。如果在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状态代码。结果是用户看到登录弹出窗口,进行身份验证,但随后看到空白页。我想这是因为数据获取承诺失败。
我的问题是- 是否有可能强制履行承诺?我想首先检查用户是否已通过身份验证,然后发出对后端的调用等。或者在这里可以使用其他解决方案吗?我正在学习Angular,所以即使有一个简单的解决方案,对我也不是很明显。
我喜欢使用解析器模式,但是发现很难在角度ui路由器中完成这些类型的事情。
一种解决方案是依赖项将authenticatedUser解析器的结果注入到您想要保护的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-> tickety),而不是一次全部同步。
我希望这可以帮助..希望有一种更好的方法..那就是为什么即时搜索通过堆栈溢出。