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 相关文章推荐
StringTemplate遇见jQuery冲突的解决方法
Sep 22 Javascript
收集json解析的四种方法分享
Jan 17 Javascript
创建、调用JavaScript对象的方法集锦
Dec 24 Javascript
详解Bootstrap的iCheck插件checkbox和radio
Aug 24 Javascript
angular实现商品筛选功能
Feb 01 Javascript
Bootstrap进度条学习使用
Feb 09 Javascript
基于jquery.page.js实现分页效果
Jan 01 jQuery
vue2.0 父组件给子组件传递数据的方法
Jan 15 Javascript
vue.js或js实现中文A-Z排序的方法
Mar 08 Javascript
js中自定义react数据验证组件实例详解
Oct 19 Javascript
Cocos2d实现刮刮卡效果
Dec 20 Javascript
JS前端使用canvas实现物体的点选示例
Aug 05 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实现的登录页面信息提示功能示例
2017/07/24 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
JS event使用方法详解
2008/04/28 Javascript
jQuery 判断元素上是否绑定了事件
2009/10/28 Javascript
JS+CSS设置img在DIV中只显示Img垂直居中的部分
2013/10/24 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
JavaScript-RegExp对象只能使用一次问题解决方法
2014/06/23 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
2015/08/07 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
Bootstrap框架动态生成Web页面文章内目录的方法
2016/05/12 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
基于JS实现翻书效果的页面切换样式
2017/02/16 Javascript
jQuery插件FusionCharts实现的MSBar2D图效果示例【附demo源码】
2017/03/24 jQuery
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
python win32 简单操作方法
2017/05/25 Python
基于python的字节编译详解
2017/09/20 Python
Python实现的个人所得税计算器示例
2018/06/01 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
2018/12/24 Python
Python简易版停车管理系统
2019/08/12 Python
Python调用钉钉自定义机器人的实现
2020/01/03 Python
Python图像处理库PIL的ImageGrab模块介绍详解
2020/02/26 Python
sublime3之内网安装python插件Anaconda的流程
2020/11/10 Python
Merrell迈乐澳大利亚网站:购买户外登山鞋
2017/05/28 全球购物
专门经营化妆刷的美国彩妆品牌:Sigma Beauty
2017/09/11 全球购物
Smashbox英国官网:美国知名彩妆品牌
2017/11/13 全球购物
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
美国折扣香水网站:The Perfume Spot
2020/12/12 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
应用电子技术专业个人求职信
2013/09/21 职场文书
公司市场专员岗位职责
2014/06/29 职场文书
特岗教师个人总结
2015/02/10 职场文书
CSS 新特性 contain控制页面的重绘与重排问题
2021/04/30 HTML / CSS
SpringBoot使用ip2region获取地理位置信息的方法
2022/06/21 Java/Android