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 Prototype 对象扩展
May 15 Javascript
javascript计算当月剩余天数(天数计算器)示例代码
Jan 09 Javascript
表单序列化与jq中的serialize使用示例
Feb 21 Javascript
jQuery动态背景图片效果实现方法
Jul 03 Javascript
浅谈JavaScript中变量和函数声明的提升
Aug 09 Javascript
jquery实现文字单行横移或翻转(上下、左右跳转)
Jan 08 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
Mar 06 Javascript
js读取本地文件的实例
Dec 22 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
May 28 jQuery
JavaScript 九种跨域方式实现原理
Feb 11 Javascript
React倒计时功能实现代码——解耦通用
Sep 18 Javascript
解决VantUI popup 弹窗不弹出或无蒙层的问题
Nov 03 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
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
PHP笛卡尔积实现算法示例
2018/07/30 PHP
document.getElementById方法在Firefox与IE中的区别
2010/05/18 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
2013/08/09 Javascript
jQuery中事件对象e的事件冒泡用法示例介绍
2014/04/25 Javascript
用js模拟struts2的多action调用示例
2014/05/19 Javascript
JQuery对表单元素的基本操作使用总结
2014/07/18 Javascript
js分页工具实例
2015/01/28 Javascript
bootstrap datetimepicker2.3.11时间插件使用
2016/11/19 Javascript
AngularJs上传前预览图片的实例代码
2017/01/20 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
详解Vue学习笔记进阶篇之列表过渡及其他
2017/07/17 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
BootStrap Table实现server分页序号连续显示功能(当前页从上一页的结束序号开始)
2017/09/12 Javascript
webpack 插件html-webpack-plugin的具体使用
2018/04/09 Javascript
微信小程序页面间值传递的两种方法
2018/11/26 Javascript
微信小程序身份证验证方法实现详解
2019/06/28 Javascript
Python警察与小偷的实现之一客户端与服务端通信实例
2014/10/09 Python
python中安装模块包版本冲突问题的解决
2017/05/02 Python
python实现音乐下载器
2018/04/15 Python
Python全局变量与局部变量区别及用法分析
2018/09/03 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
2019/07/15 Python
Python 日期的转换及计算的具体使用详解
2020/01/16 Python
python统计函数库scipy.stats的用法解析
2020/02/25 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
Kmeans均值聚类算法原理以及Python如何实现
2020/09/26 Python
python破解同事的压缩包密码
2020/10/14 Python
Python基于template实现字符串替换
2020/11/27 Python
python实现经纬度采样的示例代码
2020/12/10 Python
校园门卫岗位职责
2013/12/09 职场文书
会计应届生的自荐信
2013/12/13 职场文书
应聘自荐信
2013/12/14 职场文书
美术国培研修感言
2014/02/12 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
志愿者事迹材料
2014/12/26 职场文书