1. 程式人生 > >react-router4.x 路由許可權控制

react-router4.x 路由許可權控制

想必大家在使用react-router的時候,有的元件是需要登入才能訪問的(private),有的是開放的(public)

現在給大家介紹一下我的實現方式(僅供參考,如有更好的思路,歡迎在評論區回覆)
1.第一種封裝一個私有路由
這是我的路由配置,Route大家都知道。不用多講。PrivateRoute 這個是我自己封裝的程式碼如下:
PrivateRoute.jsx


import React from 'react';
import {Route,Redirect,withRouter} from 'react-router-dom';
import PropTypes from 'prop-types'
; import storage from 'utils/storage.js'; //私有路由,只有登入的使用者才能訪問 class PrivateRoute extends React.Component{ componentWillMount(){ let isAuthenticated = storage.getItem("token") ? true :false; this.setState({isAuthenticated:isAuthenticated}) if(!isAuthenticated){ const
{history} = this.props; setTimeout(() => { history.replace("/login"); }, 1000) } } render(){ let { component: Component,path="/",exact=false,strict=false} = this.props; return this.state.isAuthenticated ? ( <Route path={path} exact={exact} strict={strict} render={(props)=>( <Component {...props} /> )} /> ) : ("請重新登入"); } } PrivateRoute.propTypes ={ path:PropTypes.string.isRequired, exact:PropTypes.bool, strict:PropTypes.bool, component:PropTypes.func.isRequired } export default withRouter(PrivateRoute);

使用:

.......
import React from 'react';
import {BrowserRouter as Router , HashRouter ,  Route,Link,Switch ,withRouter} from 'react-router-dom';
import {syncHistoryWithStore} from 'react-router-redux'
import reducer from '../reducers/index.js';
import Home from 'container/Home.jsx';
import Login from 'container/Login.jsx';
import Regist from 'container/Regist';
import PrivateRoute from 'component/common/PrivateRoute.jsx';
.......
<Route {...props} path="/login" component={Login} />
<Route {...props} path="/regist" component={Regist} />
<PrivateRoute  path="/home"  component={Home} />
<Route  {...props}  component={Login} />

程式碼很簡單,仔細看一下就明白。這裡的PrivateRoute 屬性介面和 Route基本類似。我這裡只是提供一種思路,大家可以根據自己的業務新增自己的特色。

  1. 第二種是使用高階元件。

高階元件(HOC)是react中對元件邏輯進行重用的高階技術。但高階元件本身並不是React API。它只是一種模式,這種模式是由react自身的組合性質必然產生的。具體而言,高階元件就是一個函式,且該函式接受一個元件作為引數,並返回一個新的元件。

現在知道了高階元件是什麼,現在我們就用該思路來做一個高階私有路由 HocPrivateRoute程式碼如下
HocPrivateRoute.jsx

import React from 'react';
import {Route,Redirect,withRouter} from 'react-router-dom';
import PropTypes from 'prop-types';
import storage from 'utils/storage.js';

function withHocPrivateRoute(WrappedComponent,hocProps){
    if(!!!WrappedComponent){
        throw new Error("缺少元件引數");
        return false;
    }
    //withRouter 也是一個高階元件 傳遞 history
    return withRouter(
    class extends React.Component{
        constructor(props) {
          super(props);
        }

        componentWillMount(){
            let  isAuthenticated =  storage.getItem("token") ? true :false;
            this.setState({isAuthenticated:isAuthenticated})
            if(!isAuthenticated){
              const {history} = this.props;
              setTimeout(() => {
                history.replace("/login");
              }, 1000)
            }
        }

        render(){
            return this.state.isAuthenticated ?  (
                <WrappedComponent {...hocProps} />
            ) : ("請重新登入");
        }
    }
    )
}


export default withHocPrivateRoute;

使用:

...
import React from 'react';
import {BrowserRouter as Router , HashRouter ,  Route,Link,Switch ,withRouter} from 'react-router-dom';
import {syncHistoryWithStore} from 'react-router-redux'
import reducer from '../reducers/index.js';
import Home from 'container/Home.jsx';
import Login from 'container/Login.jsx';
import Regist from 'container/Regist';
//import PrivateRoute from 'component/common/PrivateRoute.jsx';
import HocPrivateRoute from 'component/common/HocPrivateRoute.jsx';
const  PrivateRoute =  HocPrivateRoute(Route);
...
<Switch>
<Route {...props} path="/login" component={Login} />
<Route {...props} path="/regist" component={Regist} />
<PrivateRoute  path="/home"  component={Home} />
<Route  {...props}  component={Login} />
</Switch>

總結:

細心的同學會發現,其實程式碼很相似,但是模式確實不一樣。這也從側門說明js function 和 class 本質是一樣的。
喜歡的朋友給個贊!!!!

相關推薦

react-router4.x 路由許可權控制

想必大家在使用react-router的時候,有的元件是需要登入才能訪問的(private),有的是開放的(public)現在給大家介紹一下我的實現方式(僅供參考,如有更好的思路,歡迎在評論區回覆)1.第一種封裝一個私有路由這是我的路由配置,Route大家都知道。不用多講。PrivateRoute 這個是我

react-router4.x使用 路由傳值

react-router 路由傳值分為 動態路由傳值 和 get傳值 兩種 1、動態路由傳值 配置: <Route path="/content/:aid" component={Content} /> 對應的動態路由載入的元件裡面獲取傳值 //

React路由 react-router4.x的基本配置

/* react路由的配置: 1、找到官方文件 https://reacttraining.com/react-router/web/example/basic 2、安裝 cnpm install react-router-dom --save

react-router4.x使用 js實現路由跳轉

實現js跳轉路由官方文件:js路由跳轉 1、要引入Redirect import { BrowserRouter as Router,Route, Link, Redirect, withRouter} from "react-router-dom"; 2、定義一個

react路由許可權控制

路由許可權控制可以分為兩種粒度 一是頁面級的粒度,只要在路由跳轉的時候做個判斷就好了 二是元素級的粒度,這個就需要上react高階元件了 頁面級粒度——dva在model中判斷 許可權認證和登陸判斷一般是分不開的 //

asp.net後臺管理系統-登陸模組-路由許可權控制_1

using System.Web.Routing; //重寫System.Web.Routing中Initialize方法 protected override void Initialize(RequestContext requestContext) {

Vue 路由許可權控制,只能從登陸頁面進入系統

實現這種校驗分幾個步驟 1.設定路由是否需要校驗的閾值 在路由配置加上meta的判斷 routes: [{ path: '/', name: 'Login', component: () => import('@/pages/log

react + spring boot 選單許可權控制-動態載入二級選單

首先是給路徑建表,存在資料庫裡 SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `route_config` -- ----------------------

X-Pack許可權控制之給Kibana加上登入控制以及index_not_found_exception問題解決

0. 背景 我們在使用ELK進行日誌記錄的時候,通過網址在Kibana中檢視我們的應用程式(eg: Java Web)記錄的日誌, 但是預設是任何客戶端都可以訪問Kibana的, 這樣就會造成很不安全,我們應該設定相應的使用者名稱和密碼, 只有通過登入使用者名稱和密碼才能通過Kibana檢視我們的日誌。

react-router 4.x 路由按需加載

HA sync tac roo ID rem route RR fig react-router 4 代碼分割(按需加載) 官方文檔 https://serverless-stack.com/chapters/code-splitting-in-create-react-

小結 react-router 4.x路由的使用

React Router 4.x 前言 以4.0版本為例, 我們在下載時, 要下載react-router-dom,注意不要下載 react-router react-router-dom的變數更全,更符合我們的需要 路由分為兩種模式 HashRouter

React成長路之踩坑路:react-router4路由傳參(@react-router4.3.1)

在[email protected]中傳參有三種方式 一、通過params傳參:   1、在路由表中: <Route path="/search/:type/:keyword?" component={Search} />   2、Link處使用: <Li

react專案—路由和巢狀子路由react-router4.0)

前言:在做專案的時候,花費了幾天的時間才把路由問題解決,但是對react的幾種路由的區分和使用,我現在也是整的還不清楚。 1、安裝相關的包: (1)npm install --save-dev react-router (2)npm install --save-dev

react-router4中巢狀路由的寫法

因為本人也是react的初學者,也是在一遍摸索著一邊解決一些小的問題來分享出來,希望大家能共同交流。 接下來談一談react-router4中如何寫巢狀路由。因為在前幾篇部落格裡寫了用react-router實現單頁面跳轉,但是沒有測試巢狀路由,導致巢狀的部分無法實現正常跳轉,現已改正,並來說一

單點登入(十八)----cas4.2.x客戶端增加許可權控制shiro

我們在上面章節已經完成了cas4.2.x登入啟用mongodb的驗證方式。也完成了獲取管理員身份屬性現在需要做的就是給客戶端 cas client加上 許可權控制。許可權控制可以使用spring Security或者shiro。安全框架Shiro和Spring Securit

如何用 Vue 實現前端許可權控制路由許可權 + 檢視許可權 + 請求許可權

隨著前後端分離架構的流行,許可權控制這個曾經陌生的話題開始進入很多前端同學的視野,作為一名前端,可能部分同學會認為許可權是後端的事,其實這個想法是片面的,後端是許可權控制的最後一扇門,而在這之前,做好前端許可權控制至少有以下幾個原因:通過控制路由和請求,將越權請求攔截在前端,

react高階元件之經典應用:許可權控制

許可權控制算是軟體專案中的常用功能了。在網站中,許可權控制一般分為兩個維度:頁面級別和頁面元素級別。我們來說說頁面元素粒度的許可權控制。在某個頁面中,有個“建立使用者”的按鈕,管理員才能看到。一般想到的做法類似這樣class Page extends Component{

elk模組x-pack簡單替代,按照索引設定不同使用者(nginx許可權控制

按照url路徑劃分不同業務組的應用 例如nginx日誌顯示: "POST/elasticsearch/logstash-ceshi-1*/_field_stats?level=indices HTTP/1.1" 401195 "http://192.168.6.3:9999

使用 Nginx 的 X-Sendfile 機制控制檔案訪問許可權(php版)

BBS或者網站經常會有隻有你有許可權才能看到這個頁面,或者下載這個資源,日前探訪了nginx伺服器怎麼實現這個檔案控制的,用到了x-sendfile。 一、什麼是 X-Sendfile? X-Sendfile 是一種將檔案下載請求由後端應用轉交給前端 web 伺服器

Spring Boot 2.X(十八):整合 Spring Security-登入認證和許可權控制

前言 在企業專案開發中,對系統的安全和許可權控制往往是必需的,常見的安全框架有 Spring Security、Apache Shiro 等。本文主要簡單介紹一下 Spring Security,再通過 Spring Boot 整合開一個簡單的示例。 Spring Security 什麼是 Spring Se