2016-09-16 2 views
-1

Думаю, я всегда мог бы добавить логин в WillTransitionTo, который сделал бы вызов в магазин через Redux, чтобы проверить, что пользователь вошел в систему, но это кажется немного взломанным, тем более, так как я должен добавить логику WillTransitionTo() к каждому компоненту.Чистый способ перенаправления пользователя, который не вошел в систему с помощью React?

У кого-нибудь есть идеи? Я собираюсь работать над подключением чего-то к isAuthorized с помощью onEnter.

Это корневой корень приложения, который выполняет подключение к ответному маршрутизатору.

реагируют-маршрутизатор: 2.0.4

реагируют: 15.0.2

const store = configureStore(); 


function isAuthorized() { 

} 

render(
    <Provider store={store}> 
    <Router history={browserHistory}> 

     <Route path="/" component={Application} onEnter={isAuthorized}> 
      <IndexRoute component={DashboardPage} /> 
      <Route path="login" component={LoginPage} /> 
      <Route path="dashboard" component={DashboardPage} /> 
      <Route path="items" component={DashboardPage} /> 
      <Route path="item-categories" component={DashboardPage} /> 
      <Route path="modifiers" component={DashboardPage} /> 
      <Route path="taxes" component={DashboardPage} /> 
      <Route path="discounts" component={DashboardPage} /> 
      <Route path="orders" component={DashboardPage} /> 
      <Route path="users" component={DashboardPage} /> 
     </Route> 
    </Router> 
    </Provider>, 
    document.getElementById("application") 
); 

Обратите внимание, что в примере Идент потока использует localStorage сохраняться userAccess маркеры и т.д. Я действительно не хотят использовать localStorage или куки в это время. Я хочу свести к минимуму сложность и сохранить состояние входа в хранилище (state.user). Я специально не хочу объяснять причину этого, кроме как сказать, что существует большой объем информации, которая приходит на этапе аутентификации, который необходимо сохранить в хранилище.

+0

Вы были очень неясными с контекстом. Мы можем понять, что вы хотите, чтобы ошибка аутентификации перенаправлялась на страницу входа в систему, но вы не упоминаете о своем маршрутизаторе и настройке auth. «Чистый путь» будет полностью зависеть от этих двух вещей, поскольку маршрутизатор сделает перенаправление, а стратегия auth предоставит вам крючки для определения того, кто имеет доступ. – gelliott181

+0

Как вы упомянули, React, я предполагаю, что вы используете свой маршрутизатор. Вот пример сценария реакции-маршрутизатора, который должен быть хорошей отправной точкой. https://github.com/ReactTraining/react-router/tree/master/examples/auth-flow – gelliott181

+0

Позвольте мне изменить вопрос с большим контекстом, спасибо, ребята. Пример с потоком данных не очень полезен. – Spets

ответ

0

(Опубликовано решение от имени ОП).

Это решение работает для меня, который является небольшой модификацией на ответ:

function isAuthorized(nextState, replace) { 
    if (nextState.location.pathname === "/login") { 
     return; 
    } 
    const state = store.getState(); 
    if (state.user && state.user.loggedIn === true) { 
     return; 
    } 
    replace("/login"); 
} 


render(
    <Provider store={store}> 
     <Router history={browserHistory}> 
      <Route path="/" component={Application} onEnter={(nextState, replace) => isAuthorized(nextState, replace)}> 
       <IndexRoute component={DashboardPage} /> 
       <Route path="login" component={LoginPage} /> 
       <Route path="dashboard" component={DashboardPage} /> 
       <Route path="items" component={DashboardPage} /> 
       <Route path="item-categories" component={DashboardPage} /> 
       <Route path="modifiers" component={DashboardPage} /> 
       <Route path="taxes" component={DashboardPage} /> 
       <Route path="discounts" component={DashboardPage} /> 
       <Route path="orders" component={DashboardPage} /> 
       <Route path="users" component={DashboardPage} /> 
      </Route> 
     </Router> 
    </Provider >, 
    document.getElementById("application") 
); 
+0

Несмотря на то, что вы здесь, вы прямо обращаетесь к 'store' в' isAuthorized method'. Это будет работать, если вы поместили 'isAuthorized method' в файл' app.js * ', но если вы используете отдельный файлы для 'middlewares', тогда он не будет работать, поскольку он не имеет доступа к переменной' store'. –

+0

@RandomUser: вы можете указать OP на свой комментарий, задав вопрос - я разместил это от их имени, чтобы они не были уведомлены. – halfer

2

Вы можете попробовать сделать что-то вроде

<Route 
    path="/" 
    component={Application} 
    onEnter={ (nextState, replace) => { isAuthorized(nextState, replace, store) } } > 

И в вашей isAuthorized функции

function isAuthorized(nextState, replace, store) { 
    // Now you have access to the store, you can 
    const state = store.getState(); 

    // your logic to validate whether the user is logged in or not 
    if (state.user && state.user.loggedIn === true) { 
    // this user is authenticated 
    // continue.. 
    } 
    else { 
    // unauthenticated user, redirect the user to login page 
    replace({ 
     pathname: '/login', 
     state: { nextPathname: nextState.location.pathname } 
    }); 

    } 

} 
+0

спасибо, человек дал мне дать это вихрь, это выглядит, он должен работать. – Spets

Смежные вопросы