我創建了一個GitHub庫基本上總結了這篇文章:https://medium.com/opinionated-angularjs/techniques-for-authentication-in-angularjs-applications-7bbf0346acec
ng-login Github repo
Plunker
我會盡力解釋儘可能好,希望我幫你出些有:
(1)app.js:在應用程序定義上創建身份驗證常量
var loginApp = angular.module('loginApp', ['ui.router', 'ui.bootstrap'])
/*Constants regarding user login defined here*/
.constant('USER_ROLES', {
all : '*',
admin : 'admin',
editor : 'editor',
guest : 'guest'
}).constant('AUTH_EVENTS', {
loginSuccess : 'auth-login-success',
loginFailed : 'auth-login-failed',
logoutSuccess : 'auth-logout-success',
sessionTimeout : 'auth-session-timeout',
notAuthenticated : 'auth-not-authenticated',
notAuthorized : 'auth-not-authorized'
})
(2)認證服務:以下所有功能都在auth.js服務中實現。 $ http服務用於與服務器通信以進行認證過程。還包含授權功能,即允許用戶執行特定操作。
angular.module('loginApp')
.factory('Auth', [ '$http', '$rootScope', '$window', 'Session', 'AUTH_EVENTS',
function($http, $rootScope, $window, Session, AUTH_EVENTS) {
authService.login() = [...]
authService.isAuthenticated() = [...]
authService.isAuthorized() = [...]
authService.logout() = [...]
return authService;
} ]);
(3)會話:一個Singleton保持的用戶數據。這裏的實現取決於你。
angular.module('loginApp').service('Session', function($rootScope, USER_ROLES) {
this.create = function(user) {
this.user = user;
this.userRole = user.userRole;
};
this.destroy = function() {
this.user = null;
this.userRole = null;
};
return this;
});
(4)家長控制:認爲這是你的應用程序的「主要」功能,所有控制器從該控制器繼承,這是這個應用程序的認證的中堅力量。
<body ng-controller="ParentController">
[...]
</body>
(5)訪問控制:要拒絕向某些航線2個步驟必須實現訪問:
一)加入允許訪問每條路線的角色數據,對UI路由器的$ stateProvider服務可以在下面看到(同樣可以爲ngRoute工作)。
.config(function ($stateProvider, USER_ROLES) {
$stateProvider.state('dashboard', {
url: '/dashboard',
templateUrl: 'dashboard/index.html',
data: {
authorizedRoles: [USER_ROLES.admin, USER_ROLES.editor]
}
});
})
二)在$ rootScope。在$( '$ stateChangeStart')添加到阻止狀態改變,如果用戶沒有被授權的功能。
$rootScope.$on('$stateChangeStart', function (event, next) {
var authorizedRoles = next.data.authorizedRoles;
if (!Auth.isAuthorized(authorizedRoles)) {
event.preventDefault();
if (Auth.isAuthenticated()) {
// user is not allowed
$rootScope.$broadcast(AUTH_EVENTS.notAuthorized);
} else {
// user is not logged in
$rootScope.$broadcast(AUTH_EVENTS.notAuthenticated);
}
}
});
(6)驗證攔截:實現此方法,但不能在此代碼的範圍檢查。在每個$ http請求之後,這個攔截器檢查狀態碼,如果返回下面的一個,那麼它會廣播一個事件來強制用戶重新登錄。
angular.module('loginApp')
.factory('AuthInterceptor', [ '$rootScope', '$q', 'Session', 'AUTH_EVENTS',
function($rootScope, $q, Session, AUTH_EVENTS) {
return {
responseError : function(response) {
$rootScope.$broadcast({
401 : AUTH_EVENTS.notAuthenticated,
403 : AUTH_EVENTS.notAuthorized,
419 : AUTH_EVENTS.sessionTimeout,
440 : AUTH_EVENTS.sessionTimeout
}[response.status], response);
return $q.reject(response);
}
};
} ]);
P.S.通過添加directives.js中包含的指令,可以輕鬆避免第1條中所述的表單數據自動填充錯誤。
P.S.2該代碼可以很容易地由用戶調整,以允許看到不同的路線,或顯示不打算顯示的內容。邏輯必須在服務器端實現,這只是在ng-app上正確顯示內容的一種方式。
@MichaelCalkins只是放置一個鏈接是沒有建設性。你至少應該說明鏈接將提供什麼。 – 2014-06-27 11:28:02
我的b:AngularJS訪問控制和認證https://coderwall.com/p/f6brkg – 2014-06-27 20:55:35
請看下面的文章http://www.frederiknakstad.com/authentication-in-single-page-applications-with- angular-js/ – 2013-04-22 05:27:35