AngularJS-重定向到登录页面和会话ID的持久性



我正在寻找一种方法来完成这两件事,首先,如果找不到SessionID,我想将用户重定向到登录页面;其次,我想听听您对仅在内存中保留会话ID(没有cookie)的意见。

我为重定向想出的解决方案是:

1-创建一个名为OAuth的服务,该服务将检查SessionID是否存在,如果不存在,则重定向到登录页面,该服务还负责登录和注销方法。

app.factory('OAuth', ['$http', function ($http) {
var _SessionID = '';
return { 
login: function () {
//Do login ans store sessionID in var _SessionID
},
logout: function () {
//Do logout
},
isLoggedIn: function () {
if(_SessionID) {
return true;
}
//redirect to login page if false
}
};
}]);

2-在每个控制器中注入新的OAuth服务,并检查用户是否在中记录

app.controller('myCtrl', ['$scope', 'OAuth', function ($scope, OAuth) {
//check if user is logged
OAuth.isLoggedIn();
}]);

问题:

1-isLoggedIn()方法将在所有控制器中调用,所以我想知道是否有一种方法可以做到这一点,而不必注入服务并在每个控制器中调用它。

2-我不想用cookie来存储sessionID,而是想将其保存在OAuth的_sessionID变量中,并针对每个请求将其发送到服务器。这是一种可行/安全的方法吗?你能给我一些想法吗?

谢谢!

我使用类似的策略(拦截来自服务器的401个响应)。您可以在此处查看完整的示例:https://github.com/Khelldar/Angular-Express-Train-Seed

它在后台使用node和mobgob进行会话存储,在客户端使用精简的http拦截器,该拦截器不会重试Dan链接的请求:

var interceptor = ['$q', '$location', '$rootScope', function ($q, $location, $rootScope) {
function success(response) {
return response;
}
function error(response) {
var status = response.status;
if (status == 401) {
$location.path('/login');
}
return $q.reject(response);
}
return function (promise) {
return promise.then(success, error);
}
}];
$httpProvider.responseInterceptors.push(interceptor);

我从这里开始,Witold创建了这个很酷的拦截器,它可以处理http响应。我用它,它真的很有帮助。

在我的案例中,我使用了

带有$httpProvider的
  1. 拦截器
  2. 配置
  3. 和$window依赖项,因为$location只是将路径附加到现有url。发生的事情就像"http://www.tnote.me/#/api/auth",它应该像bene一样"http://www.tnote.me/auth">

代码片段如下。

noteApp = angular.module('noteApp', ['ngRoute', 'ngCookies'])
.factory('authInterceptor', ['$rootScope', '$q', '$cookies', '$window', 
function($rootScope, $q, $cookies, $window) {
return {
request: function (req) {
req.headers = req.headers || {};
if ($cookies.token) {
req.headers.Authorization = 'Bearer ' + $cookies.token;  
}
return req;
},
responseError: function (rejection) {
if (rejection.status == 401) {
$window.location = '/auth';      
}
return $q.reject(rejection);
}
}
}])
.config(['$routeProvider', '$httpProvider', function($httpProvider) {
$httpProvider.interceptors.push('authInterceptor');  
}
])

这将起作用。它在我的应用程序中运行良好

var interceptor = function ($q, $location) {
return {
request: function (config) {//req
console.log(config);
return config;
},
response: function (result) {//res
console.log('Repos:');
console.log(result.status);
return result;
},
responseError: function (rejection) {//error
console.log('Failed with', rejection.status, 'status');
if (rejection.status == 403) {
$location.url('/dashboard');
}
return $q.reject(rejection);
}
}
};
module.config(function ($httpProvider) {
$httpProvider.interceptors.push(interceptor);
});

最新更新