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 相关文章推荐
javascript中Math.random()使用详解
Apr 15 Javascript
jquery操作select元素和option的实例代码
Feb 03 Javascript
Bootstrap基本组件学习笔记之列表组(11)
Dec 07 Javascript
Html中 IFrame的用法及注意点
Dec 22 Javascript
微信小程序开发之map地图实现教程
Jun 08 Javascript
关于jQuery.ajax()的jsonp碰上post详解
Jul 02 jQuery
理解Angular的providers给Http添加默认headers
Jul 04 Javascript
Vuex 入门教程
Jan 10 Javascript
vue全局使用axios的方法实例详解
Nov 22 Javascript
vue-router beforeEach跳转路由验证用户登录状态
Dec 26 Javascript
ES6 Map结构的应用实例分析
Jun 26 Javascript
JavaScript 绘制饼图的示例
Feb 19 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
多重?l件?合查?(一)
2006/10/09 PHP
浅析ThinkPHP中的pathinfo模式和URL重写
2014/01/06 PHP
通过chrome浏览器控制台(Console)进行PHP Debug的方法
2016/10/19 PHP
php中final关键字用法分析
2016/12/07 PHP
php可变长参数处理函数详解
2017/02/22 PHP
Mootools 1.2教程 Tooltips
2009/09/15 Javascript
javascript简单性能问题及学习笔记
2014/02/04 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
2014/12/10 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
2016/12/26 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
backbone简介_动力节点Java学院整理
2017/07/14 Javascript
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
详解vue-router导航守卫
2019/01/19 Javascript
layer弹出层显示在top顶层的方法
2019/09/11 Javascript
angular共享依赖的解决方案分享
2020/10/15 Javascript
[01:29]2017 DOTA2国际邀请赛官方英雄手办展示
2017/03/18 DOTA
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
用Python编程实现语音控制电脑
2014/04/01 Python
Python Web框架Flask下网站开发入门实例
2015/02/08 Python
使用Python的Flask框架实现视频的流媒体传输
2015/03/31 Python
Python中的上下文管理器和with语句的使用
2018/04/17 Python
医学院学生求职简历的自我评价
2013/10/24 职场文书
五一家具促销方案
2014/01/10 职场文书
采购部经理岗位职责
2014/02/10 职场文书
初一学生期末评语
2014/04/24 职场文书
优秀班组事迹材料
2014/12/24 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
刑事上诉状范文
2015/05/22 职场文书
大学社团活动总结怎么写
2019/06/21 职场文书
关于感恩的作文
2019/08/26 职场文书
vue3不同环境下实现配置代理
2022/05/25 Vue.js