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 相关文章推荐
window.requestAnimationFrame是什么意思,怎么用
Jan 13 Javascript
javascript中定义私有方法说明(private method)
Jan 27 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
Jun 29 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
Jan 23 Javascript
JQuery实现简单的服务器轮询效果实例
Mar 31 Javascript
JS操作COOKIE实现备忘记录的方法
Apr 01 Javascript
漂亮! js实现颜色渐变效果
Aug 12 Javascript
jQuery实现邮箱下拉列表自动补全功能
Sep 08 Javascript
js脚本编写简单刷票投票系统
Jun 27 Javascript
react-native 封装选择弹出框示例(试用ios&android)
Jul 11 Javascript
vue打包相关细节整理(小结)
Sep 28 Javascript
vue 父组件给子组件传值子组件给父组件传值的实例代码
Apr 15 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
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
怎样在php中使用PDF文档功能
2006/10/09 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
2011/11/07 PHP
Linux下CoreSeek及PHP扩展模块的安装
2012/09/23 PHP
基于PHP异步执行的常用方式详解
2013/06/03 PHP
使用PHP导出Word文档的原理和实例
2013/10/21 PHP
php实现加减法验证码代码
2014/02/14 PHP
php CI框架插入一条或多条sql记录示例
2014/07/29 PHP
基于php的微信公众平台开发入门实例
2015/04/15 PHP
javascript之ESC(第二类混淆)
2007/05/06 Javascript
用js代码和插件实现wordpress雪花飘落效果的四种方法
2014/12/15 Javascript
JavaScript中getUTCMinutes()方法的使用详解
2015/06/10 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
jQuery文件上传控件 Uploadify 详解
2016/06/20 Javascript
Node.js数据库操作之连接MySQL数据库(一)
2017/03/04 Javascript
javascript数组去重常用方法实例分析
2017/04/11 Javascript
微信小程序实现登录页云层漂浮的动画效果
2017/05/05 Javascript
纯javascript前端实现base64图片下载(兼容IE10+)
2018/09/14 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
详解@Vue/Cli 3 Invalid Host header 错误解决办法
2019/01/02 Javascript
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
Python定时任务APScheduler原理及实例解析
2020/05/30 Python
详解pandas获取Dataframe元素值的几种方法
2020/06/14 Python
对python中list的五种查找方法说明
2020/07/13 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
加拿大女装网上购物:Reitmans
2016/10/20 全球购物
Foot Locker加拿大官网:美国知名运动产品零售商
2019/07/21 全球购物
条幅标语大全
2014/06/20 职场文书
团队执行力培训心得体会
2015/08/15 职场文书
靠谱的活动总结
2019/04/16 职场文书
通知怎么写?
2019/04/17 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python