angular基于路由控制ui-router实现系统权限控制


Posted in Javascript onSeptember 27, 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);
      });
  }]);
Javascript 相关文章推荐
Javascript 写的简单进度条控件
Jan 22 Javascript
extjs grid取到数据而不显示的解决
Dec 29 Javascript
两种不同的方法实现js对checkbox进行全选和反选
May 13 Javascript
jQuery中width()方法用法实例
Dec 24 Javascript
Javascript缓存API
Jun 14 Javascript
JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】
Jan 19 Javascript
vue文件运行的方法教学
Feb 12 Javascript
如何用webpack4.0撸单页/多页脚手架 (jquery, react, vue, typescript)
Jun 18 jQuery
JS中的算法与数据结构之字典(Dictionary)实例详解
Aug 20 Javascript
vue实现跳转接口push 转场动画示例
Nov 01 Javascript
如何基于原生javaScript生成带图片的二维码
Nov 21 Javascript
js实现旋转木马轮播图效果
Jan 10 Javascript
IOS中safari下的select下拉菜单文字过长不换行的解决方法
Sep 26 #Javascript
javascript动画之模拟拖拽效果篇
Sep 26 #Javascript
微信小程序(应用号)简单实例应用及实例详解
Sep 26 #Javascript
微信小程序 框架详解及实例应用
Sep 26 #Javascript
jQuery中JSONP的两种实现方式详解
Sep 26 #Javascript
javascript的函数劫持浅析
Sep 26 #Javascript
JavaScript中this的四个绑定规则总结
Sep 26 #Javascript
You might like
ADODB的数据库封包程序库
2006/12/31 PHP
php需登录的文件上传管理系统
2020/03/21 PHP
PHP命名空间和自动加载类
2016/04/03 PHP
php中namespace及use用法分析
2016/12/06 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
JS实现悬浮移动窗口(悬浮广告)的特效
2013/03/12 Javascript
js中的数组Array定义与sort方法使用示例
2013/08/29 Javascript
js hover 定时器(实例代码)
2013/11/12 Javascript
javascript中eval和with用法实例总结
2015/11/30 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
2016/01/19 Javascript
jQuery Timelinr实现垂直水平时间轴插件(附源码下载)
2016/02/16 Javascript
js从数组中删除指定值(不是指定位置)的元素实现代码
2016/09/13 Javascript
Bootstrap 模态框(Modal)插件代码解析
2016/12/21 Javascript
javascript 中select框触发事件过程的分析
2017/08/01 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
python 写的一个爬虫程序源码
2016/02/28 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
python 常见字符串与函数的用法详解
2018/11/23 Python
Python装饰器语法糖
2019/01/02 Python
python跳出双层for循环的解决方法
2019/06/24 Python
python3.8与pyinstaller冲突问题的快速解决方法
2020/01/16 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
LODI女鞋在线商店:阿利坎特的鞋类品牌
2019/02/15 全球购物
美国正宗设计师眼镜在线零售商:EYEZZ
2019/03/23 全球购物
英国名牌男装店:Standout
2021/02/17 全球购物
校长岗位职责
2013/11/26 职场文书
保密工作责任书
2014/04/16 职场文书
期中考试反思800字
2014/05/01 职场文书
政治学专业毕业生求职信
2014/08/11 职场文书
班级出游活动计划书
2014/08/15 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
食堂采购员岗位职责
2015/04/03 职场文书
律师催款函范文
2015/06/24 职场文书
优秀志愿者感言
2015/08/01 职场文书
装修安全责任协议书
2016/03/22 职场文书
python基于opencv批量生成验证码的示例
2021/04/28 Python