React-Router如何进行页面权限管理的方法


Posted in Javascript onDecember 06, 2017

前言

在一个复杂的SAP应用中,我们可能需要根据用户的角色控制用户进行页面的权限,甚至在用户进入系统之前就进行权限的控制。本文就此一权限控制进行讨论。本文假设读者了解React和React-Router的相关使用。

从传统的Router开始

一个传统的路由大概长下边这个样式,这是没有添加任何权限限制的。

export default (store) => {
 const history = syncHistoryWithStore(hashHistory, store);
 return (
  <Router history={history}>
   <Route path="/" component={AppRoot} >
    <IndexRoute component={IndexPage} />
    <Route path="photo" component={PhotoPage} />
    <Route path="info" component={InfoPage} />
   </Route>
   {/* <Redirect path="*" to="/error" /> */}
  </Router>
 )
}

这里一共有3个页面 IndexPage, PhotoPage,InfoPage。

添加第一个权限

假设我们需要在用户进入PhotoPage之前需要验证用户是否有权限,根据store的的一个状态去判断。

先添加如下一个函数

const authRequired = (nextState, replace) => {
  // Now you can access the store object here.
  const state = store.getState();  
  if (state.admin != 1) {
   replace('/');
  }
 };

函数里我们判断了state的admin是否等于1,否则跳转到首页。

然后在Route添加 onEnter={authRequired} 属性

<Route path="photo" component={PhotoPage} onEnter={authRequired} />

通过以上,就完成了第一个权限的添加

进入系统之前就进行权限控制

如果需要在进入系统之前就进行权限控制,那么就需要改变一下策略。

比如上边的例子,加入state的admin并未加载,那么就需要在上一层的route进行数据加载

首先添加一个加载数据的函数

function loadData(nextState, replace, callback) {
  let unsubscribe;
  function onStateChanged() {
   const state = store.getState();
   if (state.admin) {
    unsubscribe();
    callback();
   }
  }
  unsubscribe = store.subscribe(onStateChanged);
  store.dispatch(actions.queryAdmin());
 }

接着再修改一下Router

<Router history={history}>
   <Route path="/" component={AppRoot} onEnter={loadData}>
    <IndexRoute component={IndexPage} />
    <Route path="photo" component={PhotoPage} onEnter={authRequired} />
    <Route path="info" component={InfoPage} />
   </Route>  
  </Router>

这样在进入下边之前,就会先进行数据加载。

通过以上简单几步,一个完整的权限控制链就完成了.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
Dec 29 Javascript
js实现图片放大缩小功能后进行复杂排序的方法
Nov 08 Javascript
解决jQuery使用JSONP时产生的错误
Dec 02 Javascript
JavaScript制作简单的日历效果
Mar 10 Javascript
jQuery无刷新上传之uploadify3.1简单使用
Jun 18 Javascript
浅析Bootstrap验证控件的使用
Jun 23 Javascript
AngularJS过滤器filter用法总结
Dec 13 Javascript
关于axios不能使用Vue.use()浅析
Jan 12 Javascript
JS实现简单的星期格式转换功能示例
Jul 23 Javascript
JS call()及apply()方法使用实例汇总
Jul 11 Javascript
浅谈JavaScript中this的指向更改
Jul 28 Javascript
通过vue.extend实现消息提示弹框的方法记录
Jan 07 Vue.js
移动前端图片压缩上传的实例
Dec 06 #Javascript
详细分析JS函数去抖和节流
Dec 05 #Javascript
微信小程序实现点击按钮修改字体颜色功能【附demo源码下载】
Dec 05 #Javascript
微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】
Dec 05 #Javascript
vue+iview写个弹框的示例代码
Dec 05 #Javascript
Node.js创建Web、TCP服务器
Dec 05 #Javascript
实例讲解javascript实现异步图片上传方法
Dec 05 #Javascript
You might like
如何在PHP中使用Oracle数据库(3)
2006/10/09 PHP
PHP4和PHP5共存于一系统
2006/11/17 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
window.open的页面如何刷新(父页面)上层页面
2012/12/28 Javascript
时间戳转换为时间 年月日时间的JS函数
2013/08/19 Javascript
jquery实现手机号码选号的方法
2015/07/31 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
浅谈node.js中async异步编程
2015/10/22 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
浅谈Vue2.0父子组件间事件派发机制
2018/01/08 Javascript
vue实现PC端录音功能的实例代码
2019/06/05 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
Python实现读写INI配置文件的方法示例
2018/06/09 Python
使用pandas批量处理矢量化字符串的实例讲解
2018/07/10 Python
利用python在excel里面直接使用sql函数的方法
2019/02/08 Python
django连接mysql数据库及建表操作实例详解
2019/12/10 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
如何在Django中使用聚合的实现示例
2020/03/23 Python
如何理解python中数字列表
2020/05/29 Python
使用Tensorflow-GPU禁用GPU设置(CPU与GPU速度对比)
2020/06/30 Python
Omio葡萄牙:全欧洲低价大巴、火车和航班搜索和比价
2019/02/09 全球购物
澳大利亚设计的优质鞋类和适合澳大利亚生活方式的服装:Rivers
2019/04/23 全球购物
adidas泰国官网:adidas TH
2020/07/11 全球购物
业务副厂长岗位职责
2014/01/03 职场文书
幼儿园英语教学反思
2014/01/30 职场文书
《最后的姿势》教学反思
2014/02/27 职场文书
数控技校生自我鉴定
2014/03/02 职场文书
2014离婚协议书范文
2014/09/10 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
庐山导游词
2015/02/03 职场文书
推荐信范文大全
2015/03/27 职场文书
婚礼迎宾词大全
2015/08/10 职场文书
2016寒假假期总结
2015/10/10 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书
volatile保证可见性及重排序方法
2022/08/05 Java/Android