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 相关文章推荐
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
Apr 18 Javascript
20行代码实现的一个CSS覆盖率测试脚本
Jul 07 Javascript
jQuery中get()方法用法实例
Dec 27 Javascript
JQuery中DOM事件冒泡实例分析
Jun 13 Javascript
JavaScript实现的简单烟花特效代码
Oct 20 Javascript
第一次接触JS require.js模块化工具
Apr 17 Javascript
解析浏览器端的AJAX缓存机制
Jun 21 Javascript
JavaScript中的splice方法用法详解
Jul 20 Javascript
Javascript 正则表达式校验数字的简单实例
Nov 02 Javascript
微信小程序 刷新上拉下拉不会断详细介绍
May 11 Javascript
vue iview实现动态路由和权限验证功能
Apr 17 Javascript
vue.js Router中嵌套路由的实用示例
Jun 27 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下实现伪 url 的超简单方法[转]
2007/09/24 PHP
PHP的几个常用加密函数
2016/02/03 PHP
fix-ie5.js扩展在IE5下不能使用的几个方法
2007/08/20 Javascript
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
javascript 获取网页标题代码实例
2014/01/22 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
jquery自适应布局的简单实例
2016/05/28 Javascript
浅谈toLowerCase和toLocaleLowerCase的区别
2016/08/15 Javascript
jQuery实现微信长按识别二维码功能
2016/08/26 Javascript
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
Scala解析Json字符串的实例详解
2017/10/11 Javascript
基于node打包可执行文件工具_Pkg使用心得分享
2018/01/24 Javascript
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
JQuery中DOM节点的操作与访问方法实例分析
2019/12/23 jQuery
js表达式与运算符简单操作示例
2020/02/15 Javascript
webpack4从0搭建组件库的实现
2020/11/29 Javascript
[01:14]3.19DOTA2发布会 三代刀塔人第二代
2014/03/25 DOTA
[59:44]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 paiN vs iG
2018/03/31 DOTA
Python中的高级数据结构详解
2015/03/27 Python
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
用python写的一个wordpress的采集程序
2016/02/27 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
Python WSGI的深入理解
2018/08/01 Python
python批量处理文件或文件夹
2020/07/28 Python
详解Flask前后端分离项目案例
2020/07/24 Python
Python如何将字符串转换为日期
2020/07/31 Python
HTML5 层的叠加的实现
2020/07/07 HTML / CSS
马来西亚排名第一的宠物用品店:Pets Wonderland
2020/04/16 全球购物
质检部岗位职责
2013/11/11 职场文书
中学家长会邀请函
2014/02/03 职场文书
五一手机促销方案
2014/03/08 职场文书
岳庙导游词
2015/02/04 职场文书
2016年会开场白台词
2015/06/01 职场文书
物业保洁员管理制度
2015/08/05 职场文书
实习感想范文
2015/08/10 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书