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 相关文章推荐
JavaScript 滚轮事件使用说明
Mar 07 Javascript
jquery弹出关闭遮罩层实例
Aug 06 Javascript
页面加载完毕后滚动条自动滚动一定位置
Feb 20 Javascript
论JavaScript模块化编程
Mar 07 Javascript
简单讲解jQuery中的子元素过滤选择器
Apr 18 Javascript
基于javascript实现表格的简单操作
May 21 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
May 24 Javascript
js css+html实现简单的日历
Jul 14 Javascript
AngularJS指令用法详解
Nov 02 Javascript
强大的JavaScript响应式图表Chartist.js的使用
Sep 13 Javascript
vue单页缓存存在的问题及解决方案(小结)
Sep 25 Javascript
koa2的中间件功能及应用示例
Mar 05 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 如何向 MySQL 发送数据
2006/10/09 PHP
获得Google PR值的PHP代码
2007/01/28 PHP
细谈php中SQL注入攻击与XSS攻击
2012/06/10 PHP
PHP new static 和 new self详解
2017/02/19 PHP
laravel withCount 统计关联数量的方法
2019/10/10 PHP
Some tips of wmi scripting in jscript (1)
2007/04/03 Javascript
IE与FireFox的兼容性问题分析
2007/04/22 Javascript
JS.findElementById()使用介绍
2013/09/21 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
2015/09/26 Javascript
JavaScript基础之AJAX简单的小demo
2017/01/29 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
vue-router单页面路由
2017/06/17 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
一文搞懂ES6中的Map和Set
2019/05/20 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
vue 动态组件用法示例小结
2020/03/06 Javascript
[01:10:02]IG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python的pycurl包用法简介
2015/11/13 Python
Ubuntu下Python2与Python3的共存问题
2018/10/31 Python
Python学习之路之pycharm的第一个项目搭建过程
2020/06/18 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
Python logging模块handlers用法详解
2020/08/14 Python
自定义html标记替换html5新增元素
2008/10/17 HTML / CSS
爱游人:Travelliker
2017/09/05 全球购物
来自世界各地的饮料:Flavourly
2019/05/06 全球购物
我的网上商城创业计划书
2013/12/26 职场文书
2014年最新版离婚协议书范本
2014/11/25 职场文书
财务负责人岗位职责
2015/02/03 职场文书
教师节主持词开场白
2015/05/29 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
五年级作文之想象作文
2019/10/30 职场文书
Python基础之Socket通信原理
2021/04/22 Python
Redis+AOP+自定义注解实现限流
2022/06/28 Redis