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 相关文章推荐
超酷的网页音乐播放器DewPlayer使用方法
Dec 18 Javascript
jQuery 源码分析笔记(6) jQuery.data
Jun 08 Javascript
JavaScript中的property和attribute介绍
Dec 26 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
Jun 22 Javascript
jQuery和JavaScript节点插入元素的方法对比
Nov 18 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
Jan 03 Javascript
详解Angular2 关于*ngFor 嵌套循环
May 22 Javascript
原生js实现简单的模态框示例
Sep 08 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
Jan 03 Javascript
微信小程序使用蓝牙小插件
Sep 23 Javascript
jQuery实现数字华容道小游戏(实例代码)
Jan 16 jQuery
如何在vue中使用jointjs过程解析
May 29 Javascript
移动前端图片压缩上传的实例
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的输入输出流
2007/02/14 PHP
PHP缓冲区用法总结
2016/02/14 PHP
Symfony实现行为和模板中取得request参数的方法
2016/03/17 PHP
PHP中的Iterator迭代对象属性详解
2019/04/12 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
laravel框架使用极光推送消息操作示例
2020/02/15 PHP
js 表格隔行颜色
2009/12/02 Javascript
Javascript document.referrer判断访客来源网址
2020/05/15 Javascript
可自己添加html的伪弹出框实现代码
2013/09/08 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
2014/12/17 Javascript
js实现正则匹配中文标点符号的方法
2015/12/23 Javascript
JavaScript中各种引用类型的常用操作方法小结
2016/05/05 Javascript
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
2016/05/12 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
Validform验证时可以为空否则按照指定格式验证
2017/10/20 Javascript
vue 中动态绑定class 和 style的方法代码详解
2018/06/01 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
JS实现烟花爆炸效果
2020/03/10 Javascript
javascript实现智能手环时间显示
2020/09/18 Javascript
[03:26]回顾2015国际邀请赛中国区预选赛
2015/06/09 DOTA
Python unittest工作原理和使用过程解析
2020/02/24 Python
Python BeautifulReport可视化报告代码实例
2020/04/13 Python
全球性的在线婚纱礼服工厂:27dress.com
2019/03/21 全球购物
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
Java的基础面试题附答案
2016/01/10 面试题
Linux文件系统类型
2012/09/16 面试题
如何做好总经理助理
2013/11/12 职场文书
学生干部学习的自我评价
2014/02/18 职场文书
社区学习雷锋活动总结
2014/04/25 职场文书
学校消防安全责任书
2014/07/23 职场文书
十佳好少年事迹材料
2014/08/21 职场文书
党校个人总结
2015/03/04 职场文书
首都博物馆观后感
2015/06/05 职场文书
ubuntu安装jupyter并设置远程访问的实现
2022/03/31 Python
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS