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关闭子窗体刷新父窗体实现方法
Dec 04 Javascript
javascript框架设计读书笔记之种子模块
Dec 02 Javascript
node.js中的require使用详解
Dec 15 Javascript
jsp 网站引入外部css或者js失效问题解决
Oct 31 Javascript
文件上传,iframe跨域数据提交的实现
Nov 18 Javascript
简单实现jQuery多选框功能
Jan 09 Javascript
js实现简单的手风琴效果
Feb 27 Javascript
jQuery Ajax向服务端传递数组参数值的实例代码
Sep 03 jQuery
JS实现点击下拉菜单把选择的内容同步到input输入框内的实例
Jan 23 Javascript
node省市区三级数据性能测评实例分析
Nov 06 Javascript
JavaScript使用prototype属性实现继承操作示例
May 22 Javascript
探索node之事件循环的实现
Oct 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
PHP5全版本绕过open_basedir读文件脚本漏洞详细介绍
2015/01/20 PHP
php自动提交表单的方法(基于fsockopen与curl)
2016/05/09 PHP
php中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
2017/11/21 PHP
PHP获取星期几的常用方法小结
2018/12/18 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
javascript 可以拖动的DIV(二)
2009/06/26 Javascript
javascript 自动填写表单的实现方法
2010/04/09 Javascript
jQueryUI写一个调整分类的拖放效果实现代码
2012/05/10 Javascript
javascript数组输出的两种方式
2015/01/13 Javascript
Bootstrap滚动监听(Scrollspy)插件详解
2016/04/26 Javascript
基于jquery实现ajax无刷新评论
2020/08/19 Javascript
微信小程序 转发功能的实现
2017/08/04 Javascript
在vue项目中使用md5加密的方法
2018/09/14 Javascript
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
js实现右键弹出自定义菜单
2020/09/08 Javascript
JavaScript实现通讯录功能
2020/12/27 Javascript
wxPython框架类和面板类的使用实例
2014/09/28 Python
Python的Django中将文件上传至七牛云存储的代码分享
2016/06/03 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
Python读取本地文件并解析网页元素的方法
2018/05/21 Python
python中时间模块的基本使用教程
2019/05/14 Python
Pandas之MultiIndex对象的示例详解
2019/06/25 Python
pycharm配置当鼠标悬停时快速提示方法参数
2019/07/31 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
使用Python将语音转换为文本的方法
2020/08/10 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
全球销量第一生发产品:Viviscal
2017/12/21 全球购物
viagogo意大利票务平台:演唱会、体育比赛、戏剧门票
2018/01/26 全球购物
市场营销求职信范文
2014/02/21 职场文书
《伯牙绝弦》教学反思
2016/02/16 职场文书
演讲稿之我的初心我的成长
2019/08/12 职场文书
如何理解python接口自动化之logging日志模块
2021/06/15 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
2021/09/25 Python
一文解答什么是MySQL的回表
2022/08/05 MySQL