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 相关文章推荐
js 新浪的一个图片播放图片轮换效果代码
Jul 15 Javascript
jQuery1.6 使用方法二
Nov 23 Javascript
JavaScript中数组对象的那些自带方法介绍
Mar 12 Javascript
js语法学习之判断一个对象是否为数组
May 13 Javascript
jQuery EasyUI Dialog拖不下来如何解决
Sep 28 Javascript
javascript 中的 delete及delete运算符
Nov 15 Javascript
jQuery插件 Jqplot图表实例
Jun 18 Javascript
浅析vue中常见循环遍历指令的使用 v-for
Apr 18 Javascript
vue中使用props传值的方法
May 08 Javascript
Vue中qs插件的使用详解
Feb 07 Javascript
ES6函数实现排它两种写法解析
May 13 Javascript
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
Apr 17 Vue.js
打造自己的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无限级分类方法及代码
2013/06/21 PHP
详解WordPress中调用评论模板和循环输出评论的PHP函数
2016/01/05 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
详解php curl带有csrf-token验证模拟提交方法
2018/04/18 PHP
jQuery实现动画效果的实例代码
2013/05/07 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
jQuery中:password选择器用法实例
2015/01/03 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
2015/03/03 Javascript
JS使用parseInt解析数字实现求和的方法
2015/08/05 Javascript
基于javascript实现文字无缝滚动效果
2016/03/22 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
2016/08/06 Javascript
整理一些最近经常遇到的前端面试题
2017/04/25 Javascript
基于react框架使用的一些细节要点的思考
2017/05/31 Javascript
微信小程序之多文件下载的简单封装示例
2018/01/29 Javascript
jquery 实现拖动文件上传加载进度条功能
2018/03/18 jQuery
解决vue-cli项目webpack打包后iconfont文件路径的问题
2018/09/01 Javascript
vue中$nextTick的用法讲解
2019/01/17 Javascript
详解Element-UI中上传的文件前端处理
2019/08/07 Javascript
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
python基础教程之对象和类的实际运用
2014/08/29 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
Python金融数据可视化汇总
2017/11/17 Python
python实现简单tftp(基于udp协议)
2018/07/30 Python
Python列表对象实现原理详解
2019/07/01 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
Django Admin 上传文件到七牛云的示例代码
2020/06/20 Python
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
澳洲的UGG雪地靴超级市场:Uggs.com.au
2020/04/06 全球购物
幼儿园师德师风学习材料
2014/05/29 职场文书
网上祭英烈活动总结
2015/02/04 职场文书
敬老院义诊活动总结
2015/05/07 职场文书
《山中访友》教学反思
2016/02/24 职场文书
react使用antd的上传组件实现文件表单一起提交功能(完整代码)
2021/06/29 Javascript
JavaScript中的宏任务和微任务详情
2021/11/27 Javascript
教你使用Python获取QQ音乐某个歌手的歌单
2022/04/03 Python