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 相关文章推荐
判定是否原生方法的JS代码
Nov 12 Javascript
如何编写高质量JS代码(续)
Feb 25 Javascript
Bootstrap每天必学之按钮(一)
Nov 24 Javascript
基于jQuery实现仿百度首页选项卡切换效果
May 29 Javascript
Javascript基于jQuery UI实现选中区域拖拽效果
Nov 25 Javascript
three.js实现3D视野缩放效果
Nov 16 Javascript
jQuery实现右侧抽屉式在线客服功能
Dec 25 jQuery
Vue cli 引入第三方JS和CSS的常用方法分享
Jan 20 Javascript
深入理解es6块级作用域的使用
Mar 28 Javascript
浅析Vue中拆分视图层代码的5点建议
Aug 15 Javascript
ElementUI之Message功能拓展详解
Oct 18 Javascript
在Vue中使用Echarts可视化库的完整步骤记录
Nov 18 Vue.js
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
Zend studio for eclipse中使php可以调用mysql相关函数的设置方法
2008/10/13 PHP
PHP中array_merge和array相加的区别分析
2013/06/17 PHP
thinkPHP实现MemCache分布式缓存功能
2016/03/23 PHP
PHP的mysqli_stat()函数讲解
2019/01/23 PHP
ImageFlow可鼠标控制图片滚动
2008/01/30 Javascript
关于UTF-8的客户端用AJAX方式获取GB2312的服务器端乱码问题的解决办法
2010/11/30 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
2011/06/27 Javascript
JavaScript地图拖动功能SpryMap的简单实现
2013/07/17 Javascript
js中将String转换为number以便比较
2014/07/08 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
jQuery实现dialog设置focus焦点的方法
2015/06/10 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
原生js的数组除重复简单实例
2016/05/24 Javascript
RGB和YUV 多媒体编程基础详细介绍
2016/11/04 Javascript
Javascript 闭包详解及实例代码
2016/11/30 Javascript
jquery对象与DOM对象转化
2017/02/08 Javascript
Angular 4.X开发实践中的踩坑小结
2017/07/04 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
Angular4学习教程之DOM属性绑定详解
2018/01/04 Javascript
Nuxt.js之自动路由原理的实现方法
2018/11/21 Javascript
Python基于socket实现简单的即时通讯功能示例
2018/01/16 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
Python使用MD5加密算法对字符串进行加密操作示例
2018/03/30 Python
Python多继承顺序实例分析
2018/05/26 Python
Python import与from import使用及区别介绍
2018/09/06 Python
django最快程序开发流程详解
2019/07/19 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
Python容器使用的5个技巧和2个误区总结
2019/09/26 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
大学生职业规划前言模板
2013/12/27 职场文书
物理系毕业生自荐书范文
2014/02/22 职场文书
应届大专毕业生自我鉴定
2014/04/08 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
大学运动会通讯稿
2015/07/18 职场文书
教您:房贷工资收入证明应该怎么写?
2019/08/19 职场文书