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 相关文章推荐
jQuery 动画基础教程
Dec 25 Javascript
使用jquery组件qrcode生成二维码及应用指南
Feb 22 Javascript
JavaScript黑洞数字之运算路线查找算法(递归算法)实例
Jan 28 Javascript
JS实现保留n位小数的四舍五入问题示例
Aug 03 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
Oct 01 Javascript
Django与Vue语法的冲突问题完美解决方法
Dec 14 Javascript
原生JS实现自定义下拉单选选择框功能
Oct 12 Javascript
fastadmin中调用js的方法
May 14 Javascript
微信小程序实现下拉刷新动画
Jun 21 Javascript
OpenLayers加载缩放控件使用方法详解
Sep 25 Javascript
Java 生成随机字符的示例代码
Jan 13 Javascript
JavaScript实现复选框全选功能
Apr 11 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
咖啡历史、消费和行业趋势
2021/03/03 咖啡文化
php实现的在线人员函数库
2008/04/09 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
2015/11/09 PHP
PHP __call()方法实现委托示例
2019/05/20 PHP
Get中文乱码IE浏览器Get中文乱码解决方案
2013/12/26 Javascript
深入理解JavaScript系列(30):设计模式之外观模式详解
2015/03/03 Javascript
JavaScript Function函数类型介绍
2015/04/08 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
深入理解(function(){... })();
2016/08/16 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
解决vue 路由变化页面数据不刷新的问题
2018/03/13 Javascript
nuxt.js 缓存实践
2018/06/25 Javascript
JS实现指定区域的全屏显示功能示例
2019/04/25 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
微信小程序的引导页实现代码
2020/06/24 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
[46:03]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
Python实现的爬虫刷回复功能示例
2018/06/07 Python
Python shutil模块用法实例分析
2019/10/02 Python
Python读取yaml文件的详细教程
2020/07/21 Python
python drf各类组件的用法和作用
2021/01/12 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
Backcountry旗下的户外商品闪购网站:steep&cheap
2016/09/22 全球购物
Notino法国:购买香水和化妆品
2019/04/15 全球购物
CSMA/CD介质访问控制协议
2015/11/17 面试题
英语简历自我评价
2014/01/26 职场文书
卖车协议书范例
2014/09/16 职场文书
房屋买卖授权委托书
2014/09/27 职场文书
2015年班组工作总结
2015/04/20 职场文书
用React Native制作一个简单的游戏引擎
2021/05/27 Javascript
Python实现智慧校园自动评教全新版
2021/06/18 Python
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS