Angular中使用ui router实现系统权限控制及开发遇到问题


Posted in Javascript onSeptember 23, 2016

前端去实现权限控制听起来有点扯淡(实际也有点扯淡),掩耳盗铃,主要是担心安全问题,但是如果在前后端分离的情况下,需要做一个带有权限控制的后台管理系统,angular基于ui-router应该怎么做呢?

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

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

前端基于angular开发的管理系统在权限控制方面需要处理如下几种情况:

1、UI,该用户对应的角色权限能够访问哪些页面不能访问哪些页面;

2、理由,当用户准备跳转到某一页面时,如果没有该页面的访问权,重定向到一个错误提示页面;

3、http请求,该用户是否具有访问某些API的权限,如果没有返回403

如果处理以上问题?

大致思路是:

1、用户登录后从server获取该用户的permission

2、然后建立一个service来保存该permission的映射关系,比如a用户的permission是查看page1,page2,那么在路由发生变更之前判断是否有访问的权限,有正常跳转,没有则跳转到统一的403页面或者其他。

3、对于http请求,可以让server来处理,判断用户是否有请求权限

获取用户permission,比如:

var permissionList; 
angular.element(document).ready(function() { 
$.get('/api/UserPermission', function(data) { 
permissionList = data; 
angular.bootstrap(document, ['App']); 
}); 
});

这里用到的是jquery的ajax,因为在此之前angular还没启动,如果我们的登录也是用angular实现,可以在登录之后让server返回permission,然后保存下来。

判断该用户是否具有某个权限,比如:

app.factory('permissions', function($rootScope) {
return {
hasPermission: function(permission) {
if (permission) {
if (typeof(permission) == "string") {
if (permissionList.indexOf(permission) > -1) {
return true;
}
}
}
return false;
}
};
});

路由权限控制:

app.run(function($rootScope, $location,$state, permissions) {
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
var permission = toState.permission; 
if (toState.name!="login"&&!permissions.hasPermission(permission)) {
// event.preventDefault();
// $state.transitionTo("login");
}
});
}); 
//路由配置
app.config(function($stateProvider, $urlRouterProvider, $controllerProvider) {
app.registerController = $controllerProvider.register;
app.loadJs = function(js) {
return function($rootScope, $q) {
var def = $q.defer(),
deps = [];
angular.isArray(js) ? (deps = js) : deps.push(js);
require(deps, function() {
$rootScope.$apply(function() {
def.resolve();
});
});
return def.promise;
};
};
$urlRouterProvider.otherwise('/login');
$stateProvider.state('login', {
url: '/login',
templateUrl: '/assets/console/pages/login.html',
controller: 'loginController',
resolve: {
deps: app.loadJs('./controllers/login')
}
});
$stateProvider.state('index', {
url: '/index',
templateUrl: '/assets/console/pages/home.html',
controller: 'indexController',
resolve: {
deps: app.loadJs('./controllers/index')
},
permission: "super_admin"
});
});

开发过程中实际会遇到的问题:

1、登录后如何刷新页面,因为我们的登录信息部分是server框架实现的,没完全分离,所以登录后登录信息没有刷新,可以通过判断fromState和toState来判断是否从登录页面跳转到指定页面,然后通过 $window.location.reload();实现页面的整体刷新。

2、跳转后当前导航的选中状态更新,state成功后刷新UI

app.run(['$rootScope', "$state", '$window', '$location', '$log', function($rootScope, $state, $window, $location, $log) {
$rootScope.$on('$stateChangeSuccess',
function(evt, toState, roParams, fromState, fromParams) {
//如果是登录进来就刷新页面
setTimeout(function(){
appCommon.initUI();
},500);
});
}]);

以上所述是小编给大家介绍的Angular中使用ui router实现系统权限控制及开发遇到问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
extjs实现选择多表自定义查询功能 前台部分(ext源码)
Dec 20 Javascript
javascript屏蔽右键代码
May 15 Javascript
基于jquery实现的可编辑下拉框实现代码
Aug 02 Javascript
实用框架(iframe)操作代码
Oct 23 Javascript
在JavaScript中处理数组之reverse()方法的使用
Jun 09 Javascript
JS实现的自定义右键菜单实例二则
Sep 01 Javascript
JS使用eval()动态创建变量的方法
Jun 03 Javascript
Highcharts入门之简介
Aug 02 Javascript
基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)
Nov 17 Javascript
js实现前端分页页码管理
Jan 06 Javascript
详解vue过滤器在v2.0版本用法
Jun 01 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
Aug 15 Javascript
打造自己的jQuery插件入门教程
Sep 23 #Javascript
jQuery.uploadify文件上传组件实例讲解
Sep 23 #Javascript
Bootstrap中点击按钮后变灰并显示加载中实例代码
Sep 23 #Javascript
jQuery实现边框动态效果的实例代码
Sep 23 #Javascript
BootStrap中按钮点击后被禁用按钮的最佳实现方法
Sep 23 #Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
Sep 23 #Javascript
bootstrap与Jquery UI 按钮样式冲突的解决办法
Sep 23 #Javascript
You might like
PHP概述.
2006/10/09 PHP
PHP 加密解密内部算法
2010/04/22 PHP
PHP的反射类ReflectionClass、ReflectionMethod使用实例
2014/08/05 PHP
php开发时容易忘记的一些技术细节
2016/02/03 PHP
使用php实现网站验证码功能【推荐】
2017/02/09 PHP
CI框架(CodeIgniter)实现的数据库增删改查操作总结
2018/05/23 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
图片在浏览器中底部对齐 解决方法之一
2011/11/30 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
jQuery的slideToggle方法实例
2013/05/07 Javascript
javascipt匹配单行和多行注释的正则表达式
2013/11/20 Javascript
js实现div的切换特效上一个下一个
2014/02/11 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
jQuery EasyUI 入门必看
2016/06/03 Javascript
[45:38]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第一局
2016/03/02 DOTA
Python3中简单的文件操作及两个简单小实例分享
2017/06/18 Python
对python操作kafka写入json数据的简单demo分享
2018/12/27 Python
python实现画五角星和螺旋线的示例
2019/01/20 Python
使用openCV去除文字中乱入的线条实例
2020/06/02 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
阿迪达斯西班牙官方网站:adidas西班牙
2016/07/21 全球购物
英国男女奢华内衣和泳装购物网站:Figleaves
2017/01/28 全球购物
美国零售商店:Blue&Cream
2017/04/07 全球购物
董事长助理岗位职责
2014/02/18 职场文书
迎元旦广播稿
2014/02/22 职场文书
团购业务员岗位职责
2014/03/15 职场文书
大学竞选班长演讲稿
2014/04/24 职场文书
销售员试用期自我评价
2014/09/15 职场文书
2015年公司新年寄语
2014/12/08 职场文书
检察院起诉书
2015/05/20 职场文书
保外就医申请书范文
2015/08/06 职场文书
对Golang中的FORM相关字段理解
2021/05/02 Golang
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android