Я работаю над приложением, в котором я буду использовать две роли, администратора и клиентов, которые в основном являются пользователями без ролей.
Я написал следующий код, в котором я указываю нужные мне маршруты и какие страницы должны быть аутентифицированы. Но когда я проверяю, есть ли у пользователя роль администратора, он всегда возвращает 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>
);
пользователь с ролью администратора:
Сначала у меня была проверка администратора за пределами трекера, но, к сожалению, размещение этого внутри трекера не помогло:
const isAdmin = Roles.userIsInRole( Meteor.userId(), 'admin' );
console.info(isAdmin); // always returns false..
У вас есть Tracker.autorun (() => {}) внутри определения функции onAuthChange. Вы выполняете onAuthChange где-нибудь в своем коде, чтобы Tracker.autorun (() => {}) выполнялся и запускал код внутри него в любое время при изменении реактивной переменной? В приведенном вами коде нет выполнения onAuthChange. Это только было определено.
Я выполнял onAuthChange где-то еще. Тем временем я обнаружил, что это тоже проблема, из-за которой мое приложение проверяет роли два раза подряд, что приводит к миганию других страниц перед окончательным перенаправлением. починил это!





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