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 相关文章推荐
JScript分割字符串示例代码
Sep 04 Javascript
将Datatable转化成json发送前台实现思路
Sep 06 Javascript
jquery库文件略庞大用纯js替换jquery的方法
Aug 12 Javascript
node.js中的fs.appendFile方法使用说明
Dec 17 Javascript
JavaScript数组去重的五种方法
Nov 05 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
Jul 11 Javascript
jQuery元素选择器实例代码
Feb 06 Javascript
AngularJS之页面跳转Route实例代码
Mar 10 Javascript
深入理解Vue Computed计算属性原理
May 29 Javascript
微信小程序实现左滑修改、删除功能
Oct 19 Javascript
vue指令v-html使用过滤器filters功能实例
Oct 25 Javascript
Echarts如何重新渲染实例详解
May 30 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冒泡排序算法代码详细解读
2011/07/17 PHP
PHP如何将log信息写入服务器中的log文件
2015/07/29 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
Symfony2实现从数据库获取数据的方法小结
2016/03/18 PHP
CodeIgniter框架基本增删改查操作示例
2017/03/23 PHP
YII框架实现自定义第三方扩展操作示例
2019/04/26 PHP
asp 的 分词实现代码
2007/05/24 Javascript
不同的jQuery API来处理不同的浏览器事件
2012/12/09 Javascript
jQuery on()方法使用技巧详解
2015/04/16 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
深入浅析JS是按值传递还是按引用传递(推荐)
2016/09/18 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
浅谈JavaScript中this的指向问题
2020/07/28 Javascript
vue实现在进行增删改操作后刷新页面
2020/08/05 Javascript
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
Python中列表、字典、元组数据结构的简单学习笔记
2016/03/20 Python
Python中 Lambda表达式全面解析
2016/11/28 Python
对python 矩阵转置transpose的实例讲解
2018/04/17 Python
Python迭代器定义与简单用法分析
2018/04/30 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
python操作gitlab API过程解析
2019/12/27 Python
python3读取autocad图形文件.py实例
2020/06/05 Python
python rolling regression. 使用 Python 实现滚动回归操作
2020/06/08 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
基于python调用jenkins-cli实现快速发布
2020/08/14 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
彪马荷兰官网:PUMA荷兰
2019/05/08 全球购物
大一军训感言
2014/01/09 职场文书
士力架广告词
2014/03/20 职场文书
医学专业大学生职业生涯规划书
2014/10/25 职场文书
总经理助理岗位职责
2015/01/31 职场文书
无犯罪记录证明样本
2015/06/16 职场文书
实践论读书笔记
2015/06/29 职场文书
Python Matplotlib绘制条形图的全过程
2021/10/24 Python
MySQL Innodb索引机制详细介绍
2021/11/23 MySQL
spring boot实现文件上传
2022/08/14 Java/Android