AngularJS身份验证的方法


Posted in Javascript onFebruary 17, 2016

权限的设计中比较常见的就是RBAC基于角色的访问控制,基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。

一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限。这样做的好处是,不必在每次创建用户时都进行分配权限的操作,只要分配用户相应的角色即可,而且角色的权限变更比用户的权限变更要少得多,这样将简化用户的权限管理,减少系统的开销。

在Angular构建的单页面应用中,要实现这样的架构我们需要额外多做一些事.从整体项目上来讲,大约有3处地方,前端工程师需要进行处理.

1. UI处理(根据用户拥有的权限,判断页面上的一些内容是否显示)

2. 路由处理(当用户访问一个它没有权限访问的url时,跳转到一个错误提示的页面)

3. HTTP请求处理(当我们发送一个数据请求,如果返回的status是401或者403,则通常重定向到一个错误提示的页面)

如果要在客户端使用AngularJS做身份验证的话,推荐使用service来做,因为service是单例的,可以很方便的在所有view,controller,directives,filters和其他service中共享数据,而不用采取暴露全局变量的方式,封装性也有一定的保障。

一个简单的例子:

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) {
}]);

在这个loginController里我们可以定义一个login function来向服务器验证用户身份:

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来判断用户是否是已经验证过的,或者匿名用户

由于AngularJS通常会使用template把页面拆分重组,此时使用routeProvider来控制各个页面的访问规则:

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' }); 
}]);

有的页面是无需身份验证就可以访问的,例如login.html,有的页面是需要登录用户才能够看到的,例如main.html,此时我们就需要通过增加通用的checkUser逻辑来判断当前用户是否能看到这些页面:

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. 
*/ 
}); 
} 
} 
}]);

这个directive注册在了rootScope上,并且监听了routeChangeStart,也是一种AOP的概念,在route change发生之前,织入了一个切面,来判断用户身份权限。由此,来达到在AngularJS中验证身份的整个逻辑。

以上所述是小编给大家介绍的AngularJS身份验证的方法,希望对大家有所帮助。

Javascript 相关文章推荐
js获取IP和PcName(IE)在vs中可用
Aug 02 Javascript
jquery实现树形二级菜单实例代码
Nov 20 Javascript
SeaJS 与 RequireJS 的差异对比
Dec 08 Javascript
JavaScript移除数组内重复元素的方法
Mar 18 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
Jan 07 Javascript
Node.js编写爬虫的基本思路及抓取百度图片的实例分享
Mar 12 Javascript
基于jQuery和CSS3实现APPLE TV海报视差效果
Jun 16 jQuery
React Native仿美团下拉菜单的实例代码
Aug 08 Javascript
前端常见跨域解决方案(全)
Sep 19 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
Feb 06 Javascript
原生JS使用Canvas实现拖拽式绘图功能
Jun 05 Javascript
jquery更改元素属性attr()方法操作示例
May 22 jQuery
基于AngularJS+HTML+Groovy实现登录功能
Feb 17 #Javascript
实例讲解jquery中mouseleave和mouseout的区别
Feb 17 #Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
Feb 17 #Javascript
Bootstrap中CSS的使用方法
Feb 17 #Javascript
Javascript实现图片轮播效果(一)让图片跳动起来
Feb 17 #Javascript
基于javascript简单实现对身份证校验
Jan 25 #Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
Feb 17 #Javascript
You might like
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
PHP下一个非常全面获取图象信息的函数
2008/11/20 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
php遍历目录方法小结
2015/03/10 PHP
php发送html格式文本邮件的方法
2015/06/10 PHP
PHP实现的简单缓存类
2015/07/29 PHP
PHP使用redis实现统计缓存mysql压力的方法
2015/11/14 PHP
PHP弱类型的安全问题详细总结
2016/09/25 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
jQuery下通过replace字符串替换实现大小图片切换
2012/05/22 Javascript
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
javascript自定义的addClass()方法
2014/05/28 Javascript
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
jQuery中hover与mouseover和mouseout的区别分析
2015/12/24 Javascript
jQuery插件uploadify实现ajax效果的图片上传
2016/06/18 Javascript
Vuejs第十二篇之动态组件全面解析
2016/09/09 Javascript
JavaScript闭包和范围实例详解
2016/12/19 Javascript
详解Vue.js入门环境搭建
2017/03/17 Javascript
webpack实现一个行内样式px转vw的loader示例
2018/09/13 Javascript
vue项目里面引用svg文件并给svg里面的元素赋值
2020/08/17 Javascript
js+canvas实现画板功能
2020/09/13 Javascript
vue+Element-ui实现登录注册表单
2020/11/17 Javascript
python中的五种异常处理机制介绍
2014/09/02 Python
Python3.x中自定义比较函数
2015/04/24 Python
python学习笔记之列表(list)与元组(tuple)详解
2017/11/23 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
python的内存管理和垃圾回收机制详解
2019/05/18 Python
Python登录系统界面实现详解
2019/06/25 Python
python爬虫构建代理ip池抓取数据库的示例代码
2020/09/22 Python
通往英国高街的商店橱窗:Down Your High Street
2020/07/19 全球购物
什么是接口(Interface)?
2013/02/01 面试题
缴纳养老保险的证明
2014/01/10 职场文书
蟋蟀的住宅教学反思
2014/04/26 职场文书
优秀班组事迹材料
2014/12/24 职场文书
五年级作文之想象作文
2019/10/30 职场文书
以下牛机,你有几个
2022/04/05 无线电