AngularJs 身份验证服务行为奇怪
AngularJs auth service behaves strangely
更新:JS中的代码
我从angular-app借用了身份验证(会话)服务,并对其进行了强烈修改:
angular.module('auth', [])
.factory('session', ['$location', '$http', '$q', ($location, $http, $q) ->
service =
requestCurrentUser: ->
if service.isAuthenticated()
$q.when service.currentUser
else
$http.get('/user').then (response) ->
console.log(response.data)
service.currentUser = response.data
service.currentUser
currentUser: null
isAuthenticated: ->
not service.currentUser?
service
])
这是一个应用程序:
BookReader = angular.module('BookReader', ['ngRoute', 'home', 'main', 'books', 'auth'])
BookReader
.config(['$routeProvider', '$httpProvider', '$locationProvider', ($routeProvider, $httpProvider, $locationProvider) ->
$routeProvider
.when '/',
templateUrl: 'assets/tour.html'
controller: 'MainCtrl'
.when '/home',
templateUrl: 'assets/main.html'
controller: 'HomeCtrl'
.when '/books',
templateUrl: 'assets/books.html'
controller: 'BooksCtrl'
])
.run(['session', (session) ->
session.requestCurrentUser()
])
所以,我想,当应用程序启动时,请求当前用户(也许控制器在请求回调之前开始工作,但其他地方的问题)。接下来,控制器:
angular.module('main', ['ngCookies'])
.controller('MainCtrl', ['$scope', '$http', '$cookies', '$location', 'session', '$log',
($scope, $http, $cookies, $location, session, $log) ->
$log.info "currentUser: " + session.currentUser + " ; isAuth: " + session.isAuthenticated()
$location.path '/home' if session.isAuthenticated()
])
angular.module('home', ['ngCookies'])
.controller('HomeCtrl', ['$scope', '$http', '$cookies', 'session', '$location', '$log'
($scope, $http, $cookies, session, $location, $log) ->
$log.info "currentUser: " + session.currentUser + " ; isAuth: " + session.isAuthenticated()
$location.path '/' unless session.isAuthenticated()
])
关键是isAuthenticated()
总是false
,但在用户登录时currentUser
不为空。因此,当我登录时,$log.info
不仅在网站刚刚加载时显示currentUser: [object Object] ; isAuth: false
,而且在我导航时也是如此。当我注销时,它显示currentUser: null ; isAuth: false
.显然,currentUser
在服务中始终为 null。但是我该如何定义它才能更改值?
您可以使用监视功能:
$scope.$watch(function() {
return session.isAuthenticated();
},
function() {
$log.info "currentUser: " + session.currentUser + " ; isAuth: " + session.isAuthenticated()
}
);
更新已验证为
isAuthenticated: ->
service.currentUser?
虽然这是异步的,但您应该在路由器中使用解析。
相关文章:
- Sencha Touch和远程服务器上的身份验证
- Javascript清除缓存以清除基本身份验证凭据
- REST的面向公众的身份验证机制
- 当需要身份验证时,ui路由器不会重定向
- 使用Facebook登录,但仍然可以获得:“;此标识池不支持未经身份验证的访问“;
- AJAX HTTP基本身份验证解决方案
- 身份验证后获取Facebook图片
- 如何对单个页面进行密码保护(这不是身份验证系统的一部分)
- Twitter应用程序专用身份验证
- Passport.js成功的身份验证根本没有调用
- 通过JavaScript访问需要身份验证的页面
- UIWebview赢得't通过基本身份验证加载动态加载的资源(通过jQuery mobile)
- 使用JavaScript捕获基本身份验证凭据
- javascript中的Spotify身份验证
- ServiceStack JavaScript服务器事件客户端的身份验证
- Twitter API 1.1无法对您2进行身份验证
- javascript api,用于在第三方域上存储身份验证令牌
- 实施Facebook's无用户身份验证的Graph API
- CRM身份验证问题
- 获取json结果的身份验证问题