react-rebac v1.0.5
react-rebac
react-rebac is a lightweight React library written in TypeScript for handling relationship-based access controls (ReBAC) in React applications. It provides components, hooks, and helpers to manage access permissions to resources based on user relationships, such as membership in an organization or a team, with roles like Admin, Member, or Viewer.
Table of Contents
Installation
Install with npm:
npm install react-rebacOr with Yarn:
yarn add react-rebacUsage
Basic Setup
- Wrap your application with the
RebacProviderto supply the authorization context. - Use
setUserto define the user's relationships with different entities. - Use
AuthorizedContentto conditionally render content based on user permissions. It now supports two modes:- Single-entity mode: Use
entityId,entityType, andrelationship. - Multi-entity mode: Use an
entitiesarray, where each element specifiesentityId,entityType, andrelationship.
- Single-entity mode: Use
Important: You must choose one approach at a time. If you provide both (for example, entityId, entityType, relationship along with entities), a warning will be logged and no content will be rendered.
Code Example
Here's an example of implementing an application using react-rebac.
import React from 'react';
import { RebacProvider, AuthorizedContent, useRebac } from 'react-rebac';
const App: React.FC = () => (
<RebacProvider>
<Header />
<MainContent />
</RebacProvider>
);
const Header: React.FC = () => {
const { setUser } = useRebac();
const userEntities = [
{ id: 'orgA', type: 'Organization', relation: 'Admin' },
{ id: 'team1', type: 'Team', relation: 'Member' },
{ id: 'team2', type: 'Team', relation: 'Viewer' },
{ id: 'orgB', type: 'Organization', relation: 'Viewer' },
];
setUser(userEntities);
return <h1>Welcome to our application!</h1>;
};
const MainContent: React.FC = () => (
<div>
<h2>Conditional content based on user access</h2>
{/* Single-entity mode examples */}
<AuthorizedContent entityId="orgA" entityType="Organization" relationship="Admin">
<h3>Organization A Admin</h3>
<p>Content visible to Organization A admins.</p>
</AuthorizedContent>
<AuthorizedContent entityId="team1" entityType="Team" relationship={['Member', 'Admin']}>
<h3>Team1 Member or Admin</h3>
<p>Content visible to Team1 members or admins.</p>
</AuthorizedContent>
{/* Multi-entity mode example */}
<AuthorizedContent
entities={[
{ entityId: 'team2', entityType: 'Team', relationship: ['Viewer', 'Member'] },
{ entityId: 'orgB', entityType: 'Organization', relationship: 'Viewer' },
]}
>
<h3>Access for Multiple Entities</h3>
<p>This content is visible if the user has access to at least one of the specified entities (Team2 Viewer/Member or OrgB Viewer).</p>
</AuthorizedContent>
</div>
);
export default App;API
RebacProvider
Contextual component that wraps the application, making the authorization context available to all child components.
useRebac
Hook for accessing the authorization context, returning userEntities, setUser, and hasAccess.
setUser(entities: Entity[]): Defines the user's relationships with various entities. AnEntityincludes{ id, type, relation }.hasAccess(entityId: string, entityType: string, relationship: string | string[]): boolean: Checks if the user has a specific relationship(s) with an entity.
AuthorizedContent
A component that conditionally renders its children based on user permissions. It supports two modes:
Single-entity mode:
entityId: stringentityType: stringrelationship: string | string[]
Multi-entity mode:
entities: { entityId: string; entityType: string; relationship: string | string[]; }[]
Note: You must choose either single-entity mode or multi-entity mode. If both are provided, no content will be rendered and a warning will be logged.
loading?: ReactNode can be provided to display a fallback element while the access state is being resolved.
useAuthorization
Hook that returns a boolean (or undefined during loading) indicating if the user has a specified relationship with a given entity.
Usage in single-entity mode:
const canView = useAuthorization("orgA", "Organization", "Admin");useUserEntities
Hook returning the list of entities associated with the user.
const userEntities = useUserEntities();License
This library is licensed under the Apache-2.0 License.