2017-02-07 8 views
6

Я пытаюсь создать веб-сайт с помощью реакции + redux. Я уже установил подлинность jwt на сервере. Что бы я хотел сделать, это ленивая загрузка некоторых моих компонентов/контейнеров и редукторов, чтобы их можно было загружать только прошедшим проверку пользователям. Я уже знаю, как скрывать компоненты от не прошедших проверку подлинности пользователей (на стороне клиента), но я бы предпочел не допустить их загрузки относительного кода JavaScript.Компоненты с ленивым загрузчиком, требующие аутентификации с помощью реакции-сокращения

Я использую webpack, и я уже изучил реактивный маршрутизатор и require-ensure (https://stackoverflow.com/a/33044701/2920112), но этот подход, похоже, вообще не обрабатывает аутентификацию. Я также рассмотрел использование fetch в некотором роде (возможно, связав частный код отдельно с webpack), но я не знаю, что делать с пакетом, как только я его извлечу.

Я приближаюсь к проблеме не так? Единственная альтернатива, которую я вижу, состоит в том, чтобы предоставить два файла HTML, одну загрузку пакета webpack только с общедоступным контентом, а также загрузку личного кода. Однако это кажется субоптимальным. Каков правильный подход?

+0

Я считаю, что вы можете использовать 'require-обеспечить', вам просто нужно включить свою собственную логику аутентификации. Аутентификация пользователя изменяет то, что вы вызываете с помощью 'require.ensure()', и какой компонент вы перейдете на обратный вызов 'cb'. – Lucas

+0

Вы нашли решение? Я столкнулся с подобной проблемой. Все активы защищены и требуют маркера в заголовке запроса. Не уверен, как захватить все, что требуется. Insure делает в фоновом режиме, чтобы он отправил токен при загрузке следующего фрагмента. –

ответ

0

Мы решили эту проблему с помощью реакции-маршрутизатор:

<Route 
    key="secured_component" 
    path="/secured" 
    onEnter={handleEnterSecuredComponent} 
    getComponent=({nextState, cb) => { 
     require.ensure([],() => { 
      cb(null, require('YourComponent').default); 
     }); 
    }} 
/> 
... 
const handleEnterSecuredComponent = (nextState, replace) => { 
    const {login: {success}} = store.getState(); 
    if (!success) { 
     replace('/login'); 
    } 
}; 

Так что ваша страница Войти должны установить в Redux {Логин: {успех: истинно}}, если проверка подлинности пользователя. Если аутентифицированный пользователь пытается получить доступ/защищен, он будет перенаправлен в/login.

require.ensure не играет никакой роли в аутентификации. Это просто точка входа для webpack, чтобы разделить кусок js-файлов для ленивой загрузки.

+0

Я уже делаю что-то подобное (с реактивным маршрутизатором), но это не мешает пользователю, не прошедшему проверку подлинности, загружать разумный код javascript, если он этого захочет. Если он вручную отправил запрос GET на URL-адрес куска, созданного webpack через 'require.ensure', не было бы механизма авторизации, чтобы он не мог его загрузить. – lgpasquale

+0

@lgpasquale: Javascript в интерфейсе не должен содержать разумного кода вообще ... Никогда не доверяйте клиенту! Все «реальные» механизмы безопасности, которые вы реализуете, должны быть только серверными. Все остальное предназначено только для UX. – sclausen