2017-01-17 10 views
2

私は各ユーザの特権をサポートするアプリケーションを持っています。したがって、ユーザが適切な許可を得なければならない場合、ユーザ、グループなどを管理することができます。ユーザーがそのような許可を得ていない場合、ユーザーはそれをしない可能性があります。リアクタ - ルータ - 実行時のルートの追加/削除

私は残りのapiを持っています。エンドポイントは、現在のユーザの許可されたリンクをすべて返しています。それで、react-routerのルートを設定したいと思います。権限が編集され、ユーザがユーザを編集する権限を失った場合、メニュー項目はメニューから消え、ルータからルートが削除されます。それ以外の場合は、メニュー項目とルートを追加する必要があります。

今私は、このセットアップを持っている:

ReactDOM.render(
    <Provider store={store}> 
    <Router history={history}> 
     <Route path="/" component={Window}> 
     <IndexRoute component={Users} /> 
     <Route path="users" component={Users} /> 
     <Route path="groups" component={Groups} /> 
     <Route path="permissions" component={Permissions} /> 
     <Route path="*" component={Error} /> 
     </Route> 
    </Router> 
    </Provider>, mount); 

しかし、私は本当に持っているしたいです:動的にこの設定を行い、アクセス権を変更するたびに実行することができます機能。

これに関するドキュメントが見つかりませんでした。その方法があれば嬉しいです。

UPDATE

与えられた回答やコメントによると、私はこの問題に取り組むために望んでいた道が反応し、ルータの宣言自然と一緒に行かないことに気づきました。

+0

なぜこれを実行時に実行したいですか?通常は、ログイン時に各ユーザーごとにアクセス権をロードする必要があります。それはあなたの人生を楽にします。 – Geethanga

+0

ユーザーは権限を変更できるため、別個のルートに必要な権限を失う可能性があります。ブロッキングは解決策かもしれませんが、ルートを削除することは私のためにきれいに見えます。これが正しい考えでない場合は、私に知らせてください。 – philipp

+0

誰かに自分の権限を編集させることで、何を期待しますか?ビジネスシナリオとは何ですか?アクセス許可を編集した後にログインできるようにすることはできますか。こうすることで、サーバー側から新しいルートを送信することができます。クライアント側で処理することを心配する必要はありません。 – Geethanga

答えて

3

、私はあなたがそれが便利でしょうと思う:

componentWillMount() { 
    let routes = []; 

    routes.push({ 
    path: '/authenticate', 
    component: LoginPage 
    }); 

routes.push({ 
    path: '/', 
    component: Main, 
    indexRoute: { component: null }, 
    getChildRoutes: (error, callback) => { 
    getNavigation().then((nav) =>{ 
     callback(null, getChildRoutes(nav.paths)) 
    }) 
    }, 
    onEnter:() => { 
    getNavigation(); 
    let token = getToken(); 
    if (token == null || token === '') redirectToAuthenticationUrl(); 
    } 
}); 

this.routes = routes; 

render() { 
    return (
    <Router key={uuid()} history={history} routes={this.routes} /> 
); 
} 

あなたがオブジェクトにあなたのルートを保存し、またあなたのルートを返します。約束を渡すことができ、この方法で権限を簡単に確認することもできます。希望が助けてくれる!

+0

私はより多くの助けをしたので、私はこの答えを受け入れました。しかし、一般に、両方の答えは、この問題のために選択された武器である 'onEnter'コールバックを使用するよう指摘されています。 – philipp

1

RouteonEnter小道具を条件付き認証に使用することができます。ユーザーがビューに入る権限を持っているかどうかを確認できます。権限がない場合は、他の場所に移動できます。

参照:/accountsに移動するときhttps://github.com/ReactTraining/react-router/blob/master/docs/API.md#onenternextstate-replace-callback

<Route path='/accounts' component={Accounts} onEnter={isAuth} /> 

const isAuth = (nextState, replace) => { 
    if (!isCurrentUserAuthorised) { 
    replace({pathname: '/'}); 
    } 
} 

isAuth方法が入力されます。明らかに、ユーザーが権限を持っているかどうかを判断するためには、独自のロジックを入れておく必要がありますが、それはそのロジックです。許可されていないユーザーに送信する場所のパス名を入力してください。私は次のセットアップを持っている私のプロジェクトの一つで

+0

私は質問がアクセスするのをブロックするだけではなく、リンクもそこにあるべきではないと思う。あなたのソリューションでは、ユーザーは引き続きリンクをクリックできるようです。 – Geethanga

+0

ルーティングロジックとUIロジックは別です。 OPは条件付きでAPIメニューに基づいてUIメニューリンクを設定できますが、手動で不正なリンクにアクセスしようとすると、リダイレクトされます。 – Tom

関連する問題