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中剪贴板兼容性、判断复制成功或失败
Mar 09 Javascript
可拖动窗口,附带鼠标控制渐变透明,开启关闭功能
Jun 26 Javascript
一句话JavaScript表单验证代码
Aug 02 Javascript
JavaScript 获取用户客户端操作系统版本
Aug 25 Javascript
无刷新预览所选择的图片示例代码
Apr 02 Javascript
原生javascript实现拖动元素示例代码
Sep 01 Javascript
jquery+ajax请求且带返回值的代码
Aug 12 Javascript
javascript解决小数的加减乘除精度丢失的方案
May 31 Javascript
JS实现的驼峰式和连字符式转换功能分析
Dec 21 Javascript
js上传图片预览的实现方法
May 09 Javascript
vue router 配置路由的方法
Jul 26 Javascript
Vue常见面试题整理【值得收藏】
Sep 20 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
德生PL330的评价与改造
2021/03/02 无线电
php学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
PHP使用imagick读取PDF生成png缩略图的两种方法
2014/03/20 PHP
javascript与CSS复习(《精通javascript》)
2010/06/29 Javascript
js 弹出框 替代浏览器的弹出框
2010/10/29 Javascript
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
JQuery中使用.each()遍历元素学习笔记
2014/11/08 Javascript
JS实现跟随鼠标立体翻转图片的方法
2015/05/04 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
js实现复选框的全选和取消全选效果
2017/01/03 Javascript
JavaScript之Map和Set_动力节点Java学院整理
2017/06/29 Javascript
微信小程序分页加载的实例代码
2017/07/11 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
详解javascript中的变量提升和函数提升
2018/05/24 Javascript
简单了解微信小程序的目录结构
2019/07/01 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
2019/10/09 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
vue简单封装axios插件和接口的统一管理操作示例
2020/02/02 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
vue中使用echarts的示例
2021/01/03 Vue.js
[06:20]2015国际邀请赛第三日top10
2015/08/08 DOTA
python网络编程之文件下载实例分析
2015/05/20 Python
Python实现的插入排序算法原理与用法实例分析
2017/11/22 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
如何用用Python将地址标记在地图上
2021/02/07 Python
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
日本最大美瞳直送网:Morecontact(中文)
2019/04/03 全球购物
恒华伟业笔试面试题
2015/02/26 面试题
门诊挂号室室长岗位职责
2013/11/27 职场文书
服装电子商务创业计划书
2014/01/30 职场文书
保安公司服务承诺书
2014/05/28 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
Python爬取英雄联盟MSI直播间弹幕并生成词云图
2021/06/01 Python