이 기사를 기본적으로 요약 한 github 저장소를 만들었습니다. https://medium.com/opinionated-angularjs/techniques-for-authentication-in-angularjs-applications-7bbf0346acec
ng-login Github 저장소
플 런커
가능한 한 잘 설명하려고 노력하겠습니다. 여러분 중 일부를 돕길 바랍니다.
(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 서비스 : 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) 세션 : 사용자 데이터를 보관하는 싱글 톤입니다. 여기의 구현은 사용자에 따라 다릅니다.
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 단계를 구현해야합니다.
a) 아래에서 볼 수 있듯이 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]
}
});
})
b) $ rootScope. $ on ( '$ 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);
}
};
} ]);
PS 첫 번째 기사에 언급 된 양식 데이터 자동 완성 버그는 directives.js에 포함 된 지시문을 추가하여 쉽게 피할 수 있습니다.
PS2 이 코드는 사용자가 쉽게 조정할 수있어 다른 경로를 보거나 표시 할 의도가없는 콘텐츠를 표시 할 수 있습니다. 로직은 반드시 서버 측에서 구현해야합니다. 이것은 ng-app에서 제대로 표시하는 방법 일뿐입니다.