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 题型问答有答案参考
Feb 17 Javascript
JavaScript参数个数可变的函数举例说明
Oct 10 Javascript
使用javascript获取页面名称
Dec 23 Javascript
jQuery中filter()方法用法实例
Jan 06 Javascript
jQuery鼠标事件汇总
Aug 30 Javascript
深入解析JavaScript中的数字对象与字符串对象
Oct 21 Javascript
Bootstrap 手风琴菜单的实现代码
Jan 20 Javascript
jquery 一键复制到剪切板的实例
Sep 20 jQuery
JavaScript实现QQ列表展开收缩扩展功能
Oct 30 Javascript
JavaScript判断变量名是否存在数组中的实例
Dec 28 Javascript
微信小程序常用赋值方法小结
Apr 30 Javascript
JavaScript实现捕获鼠标坐标
Apr 12 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
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
php中的一个中文字符串截取函数
2007/02/14 PHP
php 取得瑞年与平年的天数的代码
2009/08/10 PHP
php代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
php实现的短网址算法分享
2014/06/20 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
2016/09/22 PHP
laravel框架之数据库查出来的对象实现转化为数组
2019/10/23 PHP
javascript操作文本框readOnly
2007/05/15 Javascript
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
jQuery 淡出一个图像到另一个图像的实现代码
2013/06/12 Javascript
使用javascript控制cookie显示和隐藏背景图
2014/02/12 Javascript
javascript中expression的用法整理
2014/05/13 Javascript
推荐8款jQuery轻量级树形Tree插件
2014/11/12 Javascript
详解JavaScript对W3C DOM模版的支持情况
2015/06/16 Javascript
基于jQuery实现的QQ表情插件
2015/08/25 Javascript
JS简单实现浮动窗口效果示例
2016/09/07 Javascript
微信小程序 数据绑定详解及实例
2016/10/25 Javascript
vue中渐进过渡效果实现
2016/10/27 Javascript
详解javascript立即执行函数表达式IIFE
2017/02/13 Javascript
理解javascript async的用法
2017/08/22 Javascript
细说webpack源码之compile流程-rules参数处理技巧(1)
2017/12/26 Javascript
GOJS+VUE实现流程图效果
2018/12/01 Javascript
解决vue bus.$emit触发第一次$on监听不到问题
2020/07/28 Javascript
[50:11]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第三场
2018/04/09 DOTA
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
基于Python log 的正确打开方式
2018/04/28 Python
Anaconda下安装mysql-python的包实例
2018/06/11 Python
django 模版关闭转义方式
2020/05/14 Python
python有几个版本
2020/06/17 Python
Python基于内置函数type创建新类型
2020/10/22 Python
英国骑行、跑步、游泳、铁人三项运动装备专卖店:Wiggle
2016/08/23 全球购物
商务会议邀请函
2014/01/09 职场文书
党的群众路线教育实践活动对照检查剖析材料
2014/10/09 职场文书
80后婚前协议书范本
2014/10/24 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS