AngularJS身份驗(yàn)證的方法
權(quán)限的設(shè)計(jì)中比較常見的就是RBAC基于角色的訪問控制,基本思想是,對系統(tǒng)操作的各種權(quán)限不是直接授予具體的用戶,而是在用戶集合與權(quán)限集合之間建立一個(gè)角色集合。每一種角色對應(yīng)一組相應(yīng)的權(quán)限。
一旦用戶被分配了適當(dāng)?shù)慕巧?,該用戶就擁有此角色的所有操作?quán)限。這樣做的好處是,不必在每次創(chuàng)建用戶時(shí)都進(jìn)行分配權(quán)限的操作,只要分配用戶相應(yīng)的角色即可,而且角色的權(quán)限變更比用戶的權(quán)限變更要少得多,這樣將簡化用戶的權(quán)限管理,減少系統(tǒng)的開銷。
在Angular構(gòu)建的單頁面應(yīng)用中,要實(shí)現(xiàn)這樣的架構(gòu)我們需要額外多做一些事.從整體項(xiàng)目上來講,大約有3處地方,前端工程師需要進(jìn)行處理.
1. UI處理(根據(jù)用戶擁有的權(quán)限,判斷頁面上的一些內(nèi)容是否顯示)
2. 路由處理(當(dāng)用戶訪問一個(gè)它沒有權(quán)限訪問的url時(shí),跳轉(zhuǎn)到一個(gè)錯(cuò)誤提示的頁面)
3. HTTP請求處理(當(dāng)我們發(fā)送一個(gè)數(shù)據(jù)請求,如果返回的status是401或者403,則通常重定向到一個(gè)錯(cuò)誤提示的頁面)
如果要在客戶端使用AngularJS做身份驗(yàn)證的話,推薦使用service來做,因?yàn)閟ervice是單例的,可以很方便的在所有view,controller,directives,filters和其他service中共享數(shù)據(jù),而不用采取暴露全局變量的方式,封裝性也有一定的保障。
一個(gè)簡單的例子:
services.factory('UserService', [function() { var sdo = { isLogged: false, username: '' }; return sdo; }]);
AngularJS中使用service都是通過依賴聲明的方式來做的,比如:
var controllers = angular.module('myApp.controllers', []); /* ... */ controllers.controller('loginController', ['$scope', '$http', 'UserService', function(scope, $http, User) { }]);
在這個(gè)loginController里我們可以定義一個(gè)login function來向服務(wù)器驗(yàn)證用戶身份:
scope.login = function() { var config = { /* ... */ } // configuration object $http(config) .success(function(data, status, headers, config) { if (data.status) { // succefull login User.isLogged = true; User.username = data.username; } else { User.isLogged = false; User.username = ''; } }) .error(function(data, status, headers, config) { User.isLogged = false; User.username = ''; }); }
接著,只要聲明依賴了UserService的任何controller,view,filter等都可以通過UserService.isLogged來判斷用戶是否是已經(jīng)驗(yàn)證過的,或者匿名用戶
由于AngularJS通常會使用template把頁面拆分重組,此時(shí)使用routeProvider來控制各個(gè)頁面的訪問規(guī)則:
app.config(['$routeProvider', function($routeProvider) { $routeProvider.when('/login', { templateUrl: 'partials/login.html', controller: 'loginCtrl' , access: {isFree: true}}); $routeProvider.when('/main', { templateUrl: 'partials/main.html', controller: 'mainCtrl' }); $routeProvider.otherwise({ redirectTo: '/main' }); }]);
有的頁面是無需身份驗(yàn)證就可以訪問的,例如login.html,有的頁面是需要登錄用戶才能夠看到的,例如main.html,此時(shí)我們就需要通過增加通用的checkUser邏輯來判斷當(dāng)前用戶是否能看到這些頁面:
directives.directive('checkUser', ['$rootScope', '$location', 'userSrv', function ($root, $location, userSrv) { return { link: function (scope, elem, attrs, ctrl) { $root.$on('$routeChangeStart', function(event, currRoute, prevRoute){ if (!prevRoute.access.isFree && !userSrv.isLogged) { // reload the login route } /* * IMPORTANT: * It's not difficult to fool the previous control, * so it's really IMPORTANT to repeat the control also in the backend, * before sending back from the server reserved information. */ }); } } }]);
這個(gè)directive注冊在了rootScope上,并且監(jiān)聽了routeChangeStart,也是一種AOP的概念,在route change發(fā)生之前,織入了一個(gè)切面,來判斷用戶身份權(quán)限。由此,來達(dá)到在AngularJS中驗(yàn)證身份的整個(gè)邏輯。
以上所述是小編給大家介紹的AngularJS身份驗(yàn)證的方法,希望對大家有所幫助。
- AngularJS實(shí)現(xiàn)表單驗(yàn)證
- 詳解Angular開發(fā)中的登陸與身份驗(yàn)證
- AngularJS使用ngMessages進(jìn)行表單驗(yàn)證
- AngularJS實(shí)現(xiàn)表單手動驗(yàn)證和表單自動驗(yàn)證
- Angular2表單自定義驗(yàn)證器的實(shí)現(xiàn)
- angular實(shí)現(xiàn)表單驗(yàn)證及提交功能
- AngularJs驗(yàn)證重復(fù)密碼的方法(兩種)
- Ionic+AngularJS實(shí)現(xiàn)登錄和注冊帶驗(yàn)證功能
- AngularJS手動表單驗(yàn)證
- Angular 輸入框?qū)崿F(xiàn)自定義驗(yàn)證功能
- Angular簡單驗(yàn)證功能示例
相關(guān)文章
基于Angular中ng-controller父子級嵌套的相關(guān)屬性詳解
今天小編就為大家分享一篇基于Angular中ng-controller父子級嵌套的相關(guān)屬性詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10AngularJS基礎(chǔ) ng-non-bindable 指令詳細(xì)介紹
本文主要講解AngularJS ng-non-bindable 指令,這里幫大家整理了ng-non-bindable指令的基本知識資料,有需要的小伙伴可以參考下2016-08-08angularjs數(shù)組判斷是否含有某個(gè)元素的實(shí)例
下面小編就為大家分享一篇angularjs數(shù)組判斷是否含有某個(gè)元素的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02AngularJS使用ngOption實(shí)現(xiàn)下拉列表的實(shí)例代碼
這篇文章主要介紹了AngularJS使用ngOption實(shí)現(xiàn)下拉列表的實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-01-01Angular中$cacheFactory的作用和用法實(shí)例詳解
$cacheFactory是一個(gè)為Angular服務(wù)生產(chǎn)緩存對象的服務(wù)。接下來通過本文給大家介紹Angular中$cacheFactory的作用和用法實(shí)例詳解,非常不錯(cuò),感興趣的朋友一起看下吧2016-08-08