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 相关文章推荐
jquery随机展示头像代码
Dec 21 Javascript
红米手机抢购的js代码
Mar 10 Javascript
js获取url中的参数且参数为中文时通过js解码
Mar 19 Javascript
中文输入法不触发onkeyup事件的解决办法
Jul 09 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
Mar 06 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
Sep 02 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
Mar 09 Javascript
JavaScript获取用户所在城市及地理位置
Apr 21 Javascript
vue.js中使用echarts实现数据动态刷新功能
Apr 16 Javascript
jquery+php后台实现省市区联动功能示例
May 23 jQuery
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
Aug 03 Javascript
uni-app实现获取验证码倒计时功能
Nov 01 Javascript
基于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 采集获取指定网址的内容
2010/01/05 PHP
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
调试php程序的简单步骤
2019/10/04 PHP
Javascript 不能释放内存.
2006/09/07 Javascript
JavaScript this 深入理解
2009/07/30 Javascript
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
Jquery 插件学习实例1 插件制作说明与tableUI优化
2010/04/02 Javascript
node.js使用nodemailer发送邮件实例
2014/03/10 Javascript
JS中产生20位随机数以0-9为例也可以是a-z A-Z
2014/08/01 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
全面解析Bootstrap中transition、affix的使用方法
2016/05/30 Javascript
简单理解js的prototype属性及使用
2016/12/07 Javascript
Vue.js实现表格动态增加删除的方法(附源码下载)
2017/01/20 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
js实现黑白div块画空心的图形
2018/12/13 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
Vue自定义全局Toast和Loading的实例详解
2019/04/18 Javascript
vue开发移动端底部导航条功能
2020/04/08 Javascript
python 多进程通信模块的简单实现
2014/02/20 Python
python计算对角线有理函数插值的方法
2015/05/07 Python
Python数据库的连接实现方法与注意事项
2016/02/27 Python
Python动态生成多维数组的方法示例
2018/08/09 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
PyTorch实现ResNet50、ResNet101和ResNet152示例
2020/01/14 Python
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
机械系大学毕业生推荐信
2013/11/27 职场文书
乡镇食品安全责任书
2014/07/28 职场文书
顶岗实习计划书
2015/01/16 职场文书
新郎结婚保证书
2015/02/26 职场文书
法院个人总结
2015/03/03 职场文书
Java基础之this关键字的使用
2021/06/30 Java/Android
一文搞懂MySQL索引页结构
2022/02/28 MySQL
python中的getter与setter你了解吗
2022/03/24 Python