简体   繁体   English

对资源的 React-Admin 权限

[英]React-Admin Permissions with resource

I have a problem with the permissions of resources with React Admin.我对 React Admin 的资源权限有疑问。 I want to hide some resources with a particular role of user, using an array of roles coming inside the JWT obtained with the login.我想隐藏一些具有特定用户角色的资源,使用通过登录获得的 JWT 中的一组角色。

This is the authProvider for the authentication这是用于身份验证的 authProvider

import decodeJwt from 'jwt-decode';

export default {

    login: ({ username, password }) => {

        const request = new Request('http://myresource.org', {
            method: 'POST',
            body: JSON.stringify({ username, password }),
            headers: new Headers({ 'Content-Type': 'application/json' }),
        });
        return fetch(request)
            .then(response => {
                if (response.status < 200 || response.status >= 300) {
                    throw new Error(response.statusText);
                }
                return response.json();
            })
            .then(({ token }) => {
                const decodedToken = decodeJwt(token);
                localStorage.setItem('token', token);
                localStorage.setItem('permissions', JSON.stringify(decodedToken.roles));
             });
    },


    logout: () => {
        localStorage.removeItem('token');
        localStorage.removeItem('permissions');
        return Promise.resolve();
    },


    checkError: error => {

    },


    checkAuth: () => {
        return localStorage.getItem('token') ? Promise.resolve() : Promise.reject();
    },


    getPermissions: () => {
        const roles = localStorage.getItem('permissions');
        console.log(roles);    //This print correctly the array
        return roles ? Promise.resolve(JSON.parse(roles)) : Promise.reject();
    }
};

and this is the main app这是主要的应用程序

import * as React from "react";
import { Admin, Resource, resolveBrowserLocale } from 'react-admin';

import Dashboard from './Dashboard';

/*** Import Lingue ***/ 
import polyglotI18nProvider from 'ra-i18n-polyglot';
import englishMessages from 'ra-language-english';
import italianMessages from 'ra-language-italian';
import * as resources_IT from './translations/Resources_IT';

/*** Import Grafici ***/ 
import UserIcon from '@material-ui/icons/Group';
import HotelIcon from '@material-ui/icons/Hotel';
import BookingIcon from '@material-ui/icons/MenuBook';
import DeviceIcon from '@material-ui/icons/DeviceHub';
import CustomerIcon from '@material-ui/icons/EmojiPeople';
import DeviceAccountIcon from '@material-ui/icons/AccountBox';

/*** Import Providers ***/ 
import dataProvider from './providers/DataProvider';
import authProvider from './providers/AuthProvider';

/*** Import Resources ***/ 
import { HotelList, HotelEdit, HotelCreate } from './resources/Hotel';
import { DeviceList, DeviceEdit, DeviceCreate } from './resources/Device';
import { UserList, UserEdit, UserCreate, UserShow } from './resources/User';
import { BookingList, BookingEdit, BookingCreate } from './resources/Booking';
import { CustomerList, CustomerEdit, CustomerCreate } from './resources/Customer';
import { DeviceAccountList, DeviceAccountEdit, DeviceAccountCreate } from './resources/DeviceAccount';



/* Configurazione della lingua del Browser */
const messages = {
    it: { ...italianMessages, ...resources_IT },
    en: englishMessages,
};

const i18nProvider = polyglotI18nProvider(
    locale => messages[locale] ? messages[locale] : messages.en, resolveBrowserLocale()
);


const App = () => (

    <Admin dashboard={Dashboard} dataProvider={dataProvider} i18nProvider={i18nProvider} authProvider={authProvider}>

        {permissions => [
        permissions.indexOf('SYSADM') >= 0 ? (<Resource name="hotels" list={HotelList} edit={HotelEdit} create={HotelCreate} icon={HotelIcon} />) : null,
        ]}

        <Resource name="roles" />
        <Resource name="users" list={UserList} edit={UserEdit} create={UserCreate} icon={UserIcon} />
        <Resource name="devices" list={DeviceList} edit={DeviceEdit} create={DeviceCreate} icon={DeviceIcon} />
        <Resource name="bookings" list={BookingList} edit={BookingEdit} create={BookingCreate} icon={BookingIcon} />
        <Resource name="customers" list={CustomerList} edit={CustomerEdit} create={CustomerCreate} icon={CustomerIcon} />
        <Resource name="deviceaccounts" list={DeviceAccountList} edit={DeviceAccountEdit} create={DeviceAccountCreate} icon={DeviceAccountIcon} />

    </Admin>
);

export default App;

finally, this is the JWT:最后,这是 JWT:

{
  "aud": "backoffice-fe",
  "sub": "email@test.com",
  "idHotels": [
    "21816730-a4ef-4fea-8fb9-adc019d80485"
  ],
  "roles": [
    "SYSADM"
  ],
  "iss": "backoffice-api"
}

Seems the permissions in app.js is not correctly obtained.似乎没有正确获取 app.js 中的permissions Does anyone know how to solve it?有谁知道如何解决它?

The documentation's example:文档的示例:

https://marmelab.com/react-admin/Authorization.html https://marmelab.com/react-admin/Authorization.html

Works for me.为我工作。 Just make sure to:只要确保:

  const { loading, permissions } = usePermissions();

And then接着

 return loading
    ? (<div>Waiting for permissions...</div>)
    : (
      <>
        (your admin...)

Finally like in the doc:最后就像在文档中一样:

{permissions => [
    // Restrict access to the edit and remove views to admin only
    <Resource
        name="customers"
        list={VisitorList}
        edit={permissions === 'admin' ? VisitorEdit : null}
        icon={VisitorIcon}
    />,
    // Only include the categories resource for admin users
    permissions === 'admin'
        ? <Resource name="categories" list={CategoryList} edit={CategoryEdit} icon={CategoryIcon} />
        : null,
]}

ps: To do so, you must use a function as the only child. ps:要这样做,你必须使用一个function作为唯一的孩子。

Also if you want to add more than one child enclose them in <></>另外,如果您想添加多个子项,请将它们括在 <>/> 中

{permissions => [
    // Restrict access to the edit and remove views to admin only
    <Resource
        name="customers"
        list={VisitorList}
        edit={permissions === 'admin' ? VisitorEdit : null}
        icon={VisitorIcon}
    />,
    // Only include the categories resource for admin users
    permissions === 'admin'
        ? <>
          <Resource name="posts" list={PostList} edit={PostEdit} icon={PostIcon} />
          <Resource name="categories" list={CategoryList} edit={CategoryEdit} icon={CategoryIcon} />
          </>
        : null,
]}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM