1

是否可以在 AuthService 中处理响应并使用 SessionService 设置会话?

我现在使用成功回调在控制器中执行此操作,但我对 Angularjs 仍然很陌生,并试图了解如何自定义资源。

我正在使用 Angularjs 1.1.5

app.factory('AuthService', ['$resource', 'SessionService',
function($resource, SessionService) {

    return $resource(
        '/api/v1/auth/:action',
        {action:'@action'},
        {
            login: {
                method:'POST',
                params: {
                    action: 'login'
                }
            },
            logout: {
                method:'GET',
                params: {
                    action: 'logout'
                }
            }
        }
    );
}
]);

app.controller('LoginCtrl', ['$scope', '$location', 'AuthService', 'SessionService' function LoginCtrl($scope, $location, AuthService, SessionService) {

$scope.credentials = { email: "", password: ""};

$scope.login = function() {
    AuthService.login($scope.credentials).success(function() {
        SessionService.set('authenticated', true);
        $location.path('/home');
    });
}
}]);

app.factory("SessionService", function() {
 return {
  get: function(key) {
   return sessionStorage.getItem(key);
  },
  set: function(key, val) {
   return sessionStorage.setItem(key, val);
  },
  unset: function(key) {
   return sessionStorage.removeItem(key);
  }
 }
});
4

2 回答 2

1

我不确定 $resource 是否适合在这里使用。我认为使用普通的 $http 实现您的 AuthService 会简单得多。只需将登录和注销作为正常功能实现,然后您就可以随意在那里做任何您想做的事情。您还应该确保您返回承诺,这样如果在登录后需要执行其他操作,调用 login() 或 logout() 的人仍然可以对其执行 .then() 操作。这是一个例子:

app.factory('AuthService', ['$http', '$location' 'SessionService',
function($http, $location, SessionService) {
     var baseUrl = '/api/v1/auth/';

     function onLoginSuccess(data){
            SessionService.set('authenticated', true);
            $location.path('/home');
     }

     function onLoginFailure(error){
       SessionService.unset('authenticated');
       $location.path('/login');
     }


    return {
      login: function(credentials){
          return $http.post(baseUrl+'login', credential).then(onLoginSuccess, onLoginFailure);
      }

      logout: function(){
          return $http.get(baseUrl+'logout');
      }
    };

app.controller('LoginCtrl', ['$scope', 'AuthService', function LoginCtrl($scope, AuthService) {
    $scope.credentials = { email: "", password: ""};
    $scope.login = function() {
        AuthService.login($scope.credentials);      
    }
}]);

app.factory("SessionService", function() {
 return {
  get: function(key) {
   return sessionStorage.getItem(key);
  },
  set: function(key, val) {
   return sessionStorage.setItem(key, val);
  },
  unset: function(key) {
   return sessionStorage.removeItem(key);
  }
 }
});
于 2013-11-02T07:28:54.243 回答
0

路径 /api/v1/auth/login 上的服务器端脚本应该返回一个结果,表明登录是否成功。

例如,如果允许登录,则/api/v1/auth/login返回成功响应200。如果登录被拒绝,则/api/v1/auth/login返回错误的请求响应(失败)400

如果在这种情况下,您的代码应编写如下,

app.controller('LoginCtrl', ['$scope', '$location', 'AuthService', 'SessionService'
function LoginCtrl($scope, $location, AuthService, SessionService) {
    $scope.credentials = { email: "", password: ""};
    $scope.login = function() {
    AuthService.login($scope.credentials, function(data) { //Success callback
        SessionService.set('authenticated', true);
        $location.path('/home');
    }, function(error){ //Failure callback
        SessionService.unset('authenticated');
        $location.path('/login');
    });
}
}]);
于 2013-11-02T04:47:20.727 回答