这个问题是指
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()调用中不需要auth,这很好.
以下是服务器调用的日志:
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状态码在这里.效果是用户看到登录弹出窗口,进行身份验证,但看到空页面.我想这是因为数据获取承诺失败.
我的问题是 – 是否有可能强制许诺?我想首先检查用户是否被认证,然后发出对后端等的呼叫或者还有其他可以在这里使用的@R_301_463@案吗?我正在学习Angular,即使有一个简单的@R_301_463@案对我来说并不明显.
解决方法
我喜欢使用解析器模式,但发现在角ui路由器中做这些类型的事情是非常困难的.
一个@R_301_463@案是依赖性将authenticatedUser解析器的结果注入您想要保护的api调用解析器,如:
$stateProvider .state('root.tickets',resolve:{ authenticatedUser: securityAuthorizationProvider.requireAuthenticatedUser,ticketsy: function (Restangular,authenticatedUser) { //Call to tickets must be authenticated return Restangular.all('tickets').getList(); } } } }
这样,解析器将以一个链(authenticatedUser – > tickety)运行,而不是一次同步.
我希望这有帮助..希望有一个更好的方式来做..这就是为什么im搜索堆栈溢出.