11月在赶一个项目,这阵子比较忙,挤挤时间更一篇博客吧,如标题所述说说在ng中页面访问权限控制的问题,水平有限各位看官见谅; php
在以往的项目中,先后端常见的配合方式是前端提供页面和ui加一点DuangDuangDuang的效果,后端搭建框架数据结构和数据交互(数据交互先后端有交集),不论是.net、java or php都能一对多的提供前端服务,然而在新形式下项目中运用了前端框架,开发状况就不同了,好比我要说的这是在angular框架下完成的开发,模式是后端提供服务和api文档,页面和数据交互及逻辑处理由前端完成,前端俨然是个彻底的programer了,这个过程当中就会遇到以前意想不到的问题(若是没有作事后端开发),好比页面权限控制,不得不说,使用前端的方式去作这些设置比较纠结,由于这方面的数据,也就是这些权限的‘标示’,后端运行的时候是能够直接得到的,即像获取字段数据a.b点一下就出来了,而前端只能用http请求的方式获取,繁琐麻烦;前端
其实在ng中作页面访问权有不少种方法,各有利弊,运用的比较多的是拦截器,拦截器使得在前端日后端发送http请求以前或以后作一些操做,好比全局监测用户是否登陆,没登录就要跳转的登陆页面,登陆就能够访问页面;拦截器的使用每每配合后台数据,也就是获取到最新的‘标示’,来肯定这个页面或者下个页面要作什么操做;而这里我使用的是一种用前端控制的方式,不用数据交互,理念就是定义好不一样等级/阶段能够访问的页面,在路由的地方做拦截,针对一些不一样等级/阶段访问权限定义明确的能够参考使用这种方法,代码以下:java
...... app.run(['$rootScope', '$state', '$window', function($rootScope, $state, $window) { $rootScope.$on('$stateChangeStart', function(event, toState, toStateParams) { //用户访问等级阶段, 0 1 2 Array.prototype.contains = function(needle) { for(i in this) { if(this[i] == needle) return true; } return false; } var status=new Array("user.a","user.b","user.c","user.d","user.e","user.f","user.g"); var status0=new Array("user.a","user.b"); var status1=new Array("user.c","user.d"); var status2=new Array("user.a","user.b","user.c","user.d");
if (status.contains(toState.name)) {
if(initObj.getStatus()=="0"){ if(!status0.contains(toState.name)){ event.preventDefault(); $state.go('user.approve'); } return; } if(initObj.getStatus()=="1"){ if(!status1.contains(toState.name)){ event.preventDefault(); $state.go('user.result'); } return; } if(initObj.getStatus()=="2"){ if(!status2.contains(toState.name)){ event.preventDefault(); $state.go('user.result'); } return; } } }) }]) ......
如码所示,在ng的run里加上state监听(我这里使用了an-route-ui),当监听到路由跳转的时候就进行检测,这里设想的可访问‘标示’的status数组里包含每一个层级/阶段可访问的页面/路由,好比status里是须要检测的全集,status0、1 2分别是不一样的层级/阶段的权限访问集合,也便是ng中路由跳转的哈希值,也就表明了可访问的页面,利用这种检测手段,没有访问权限的用户就不能访问某些页面,好比用户a的的层级阶段配置是status1,包含user.c和user.d,initObj.getStatus()返回了他的状态码是1,当他想访问user.a页面的时候,就会进入initObj.getStatus()=="1"的判断,可是他的配置可访问页面不包括user.a,也即!status1.contains(toState.name)(toState.name返回要跳转的页面,这里返回user.a),接下来进入下面的操做,进入公共页面或提示页面,原理基本是这样;angularjs
固然,这种方式跟后端的控制来讲,是很是不安全的,也不严谨,由于就算项目中脚本进行发布压缩混淆后,细细浏览仍是能找到这里的设置痕迹的,而且脚本在运行以前是可编辑的,这就会形成很大的漏洞;不过在一些小项目中使用这些配置够用了,而且就算有人修改了这个status配置,数据什么的都是从后端请求的,状态不对也请求不到数据的,因此攻陷数据库才算是真黑,从前端的脚本作拦截只是玩玩测试;数据库
继续发掘其余的优化方法,有大神有更好的方法能够交流下;先到这里吧。后端
还有,光棍节到了,祝广大单身狗早日脱单。api
原文地址:angular.js中的页面访问权限设置,薛陈磊 | Share the world数组