Meteor.js с ролями response-router и alanning-ролями

Я работаю над приложением, в котором я буду использовать две роли, администратора и клиентов, которые в основном являются пользователями без ролей.

Я написал следующий код, в котором я указываю нужные мне маршруты и какие страницы должны быть аутентифицированы. Но когда я проверяю, есть ли у пользователя роль администратора, он всегда возвращает false, хотя MongoDB показывает, что у пользователя есть роль администратора (пример находится под кодом).

Что я написал до сих пор:

import { Meteor } from 'meteor/meteor';
import { Router, Route, browserHistory } from 'react-router';
import { Roles } from 'meteor/alanning:roles';

import React, { Component } from 'react';

import AuthenticationLayout from '../interface/layouts/authentication-layout';
import AdminLayout from '../interface/layouts/admin-layout';
import CustomerLayout from '../interface/layouts/customer-layout';

import NotFound from '../interface/pages/notfound';
import Login from '../interface/pages/login';
import SignUp from '../interface/pages/signup';

import AdminDashboard from '../interface/pages/admin/dashboard';
import CustomerOverview from '../interface/pages/admin/customers/customer-overview';
import ChatsOverview from '../interface/pages/admin/chats/chats-overview';
import LogsOverview from '../interface/pages/admin/logs/logs-overview';

import CustomerDashboard from '../interface/pages/customer/dashboard';

import SettingsOverview from '../interface/pages/admin/settings/settings-overview';
import RegistrationCardSettings from '../interface/pages/admin/settings/registration-cards';

const onEnterPublicPage = () => {
  if ( Meteor.userId() ) {
    browserHistory.replace('/klant');
  }
};
const onEnterPrivatePage = () => {
  if ( !Meteor.userId() ) {
    browserHistory.replace('/');
  }
};

const unauthenticatedPages = [ 
  '/', 
  '/login', 
  '/signup' 
];
const authenticatedPages = [ 
  '/admin',
  '/admin/klanten',
  '/admin/chats',
  '/admin/logboeken', 
  '/admin/instellingen',
  '/admin/instellingen/strippenkaart',
  '/klant'
];

export const onAuthChange = (isAuthenticated) => {
  Tracker.autorun(() => {
    const isAuthenticated = !!Meteor.userId();
    const pathname = browserHistory.getCurrentLocation().pathname;
    const isUnauthenticatedPage = unauthenticatedPages.includes(pathname);
    const isAuthenticatedPage = authenticatedPages.includes(pathname);

    const isAdmin = Roles.userIsInRole( Meteor.userId(), 'admin' );
    console.info(isAdmin); // always returns false..

    if (isUnauthenticatedPage && isAuthenticated) {
      browserHistory.replace('/klant');
    } else if (isAuthenticatedPage && isAuthenticated) {
      if ( isAdmin ) {
        browserHistory.replace('/admin');
      } else {
        browserHistory.replace('/klant');
      }
    } else if (isAuthenticatedPage && !isAuthenticated) {
      browserHistory.replace('/');
    }
  });
};
export const routes = (
  <Router history = {browserHistory}>
    <Route component = {AuthenticationLayout}>
        <Route path = "/login" component = {Login} />
        <Route path = "/" component = {Login} onEnter = {onEnterPublicPage} />
    </Route>
   <Route component = {AdminLayout}>
    <Route path = "/admin" component = {AdminDashboard} onEnter = {onEnterPrivatePage}/>
    <Route path = "/admin/klanten" component = {CustomerOverview} onEnter = {onEnterPrivatePage}/>
    <Route path = "/admin/chats" component = {ChatsOverview} onEnter = {onEnterPrivatePage}/>
    <Route path = "/admin/logboeken" component = {LogsOverview} onEnter = {onEnterPrivatePage}/>
    <Route path = "/admin/instellingen" component = {SettingsOverview} onEnter = {onEnterPrivatePage}/>
    <Route path = "/admin/instellingen/strippenkaart" component = {RegistrationCardSettings} onEnter = {onEnterPrivatePage}/>
  </Route>

  <Route component = {CustomerLayout}>
    <Route path = "/klant" component = {CustomerDashboard} onEnter = {onEnterPrivatePage}/>
  </Route>

    <Route path = "/signup" component = {SignUp}/>
    <Route path = "*" component = {NotFound} />
 </Router>
);

пользователь с ролью администратора: Meteor.js с ролями response-router и alanning-ролями Сначала у меня была проверка администратора за пределами трекера, но, к сожалению, размещение этого внутри трекера не помогло:

const isAdmin = Roles.userIsInRole( Meteor.userId(), 'admin' );
console.info(isAdmin); // always returns false..

Хорошо, я понял, что маршруты работают (немного), когда я добавляю группу (default-group) в проверку, например const isAdmin = Roles.userIsInRole (Meteor.userId (), ['admin'], default-group ); Но теперь перенаправление работает только тогда, когда я впервые попадаю на маршрут / klant ...

TheAmplifier 07.08.2018 21:56

У вас есть Tracker.autorun (() => {}) внутри определения функции onAuthChange. Вы выполняете onAuthChange где-нибудь в своем коде, чтобы Tracker.autorun (() => {}) выполнялся и запускал код внутри него в любое время при изменении реактивной переменной? В приведенном вами коде нет выполнения onAuthChange. Это только было определено.

Kapil 10.08.2018 15:52

Я выполнял onAuthChange где-то еще. Тем временем я обнаружил, что это тоже проблема, из-за которой мое приложение проверяет роли два раза подряд, что приводит к миганию других страниц перед окончательным перенаправлением. починил это!

TheAmplifier 15.08.2018 20:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
283
0

Другие вопросы по теме