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 相关文章推荐
初识javascript 文档碎片
Jul 13 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
Mar 25 Javascript
解析offsetHeight,clientHeight,scrollHeight之间的区别
Nov 20 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
Apr 25 Javascript
Jquery通过JSON字符串创建JSON对象
Aug 24 Javascript
js+css实现select的美化效果
Mar 24 Javascript
基于javascript中的typeof和类型判断(详解)
Oct 27 Javascript
详解Vue 中 extend 、component 、mixins 、extends 的区别
Dec 20 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
Jul 29 Javascript
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
Feb 21 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
Aug 18 Javascript
vue实现锚点定位功能
Jun 29 Vue.js
基于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
php抓取https的内容的代码
2010/04/06 PHP
php mysql 判断update之后是否更新了的方法
2012/01/10 PHP
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
怎样使用php与jquery设置和读取cookies
2013/08/08 PHP
使用EXT实现无刷新动态调用股票信息
2008/11/01 Javascript
Javascript日期对象的dateAdd与dateDiff方法
2008/11/18 Javascript
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
jquery入门——事件机制之事件中的冒泡现象示例解释
2020/09/12 Javascript
10个基于浏览器的JavaScript调试工具分享
2013/02/07 Javascript
用jQuery实现一些导航条切换,显示隐藏的实例代码
2013/06/08 Javascript
js css后面所带参数含义介绍
2013/08/18 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
将中国标准时间转换成标准格式的代码
2014/03/20 Javascript
javascript判断复选框是否选中的方法
2015/10/16 Javascript
javascript单页面手势滑屏切换原理详解
2016/03/21 Javascript
微信小程序动态的加载数据实例代码
2017/04/14 Javascript
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
2017/06/06 Javascript
webpack+vue中使用别名路径引用静态图片地址
2017/11/20 Javascript
AngularJS中的作用域实例分析
2018/05/16 Javascript
node app 打包工具pkg的具体使用
2019/01/17 Javascript
JS实现的点击按钮图片上下滚动效果示例
2019/01/28 Javascript
Python程序中使用SQLAlchemy时出现乱码的解决方案
2015/04/24 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
python3获取两个日期之间所有日期,以及比较大小的实例
2018/04/08 Python
BP神经网络原理及Python实现代码
2018/12/18 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
手把手教你实现一个canvas智绘画板的方法
2019/03/04 HTML / CSS
海滩咖啡馆:Beach Cafe
2018/02/02 全球购物
JustFab加拿大:女鞋、靴子、手袋和服装在线
2018/05/18 全球购物
C# .NET面试题
2015/11/28 面试题
原材料检验岗位职责
2014/03/15 职场文书
宪法宣传周工作方案
2014/05/26 职场文书
2014党员整改措施思想汇报
2014/10/07 职场文书
深入理解以DEBUG方式线程的底层运行原理
2021/06/21 Java/Android