This project demonstrates how to implement fine-grained authorization in a Next.js application using Permit.io. It’s a document management system where users can create, view, edit, and delete documents based on their roles and document ownership.
The application implements the following authorization model:
Additionally, document owners have full control over their own documents regardless of their role.
If you’re a reader, then this blog is for you: https://dev.to/rohan_sharma/access-control-handled-heres-how-i-built-my-dms-212
npm install
or
yarn install
or
bun install
PERMIT_PDP_URL=your-permit-pdp-url
PERMIT_SDK_TOKEN=your-permit-sdk-token
npm run dev
The application will be available at http://localhost:3000.
npm install -g @permitio/permit-cli
permit login
permit init
The application integrates with Permit.io through the permit.ts
file, which provides functions for checking permissions:
import { Permit } from 'permitio'
// Initialize Permit SDK
const permit = new Permit({
pdp: process.env.PERMIT_PDP_URL,
token: process.env.PERMIT_SDK_TOKEN,
})
// Check if a user can perform an action on a resource
export async function checkPermission(
userId: string,
action: string,
resourceType: string,
resourceAttributes: Record<string, any> = {}
): Promise<boolean> {
try {
const permitted = await permit.check(userId, action, {
type: resourceType,
...resourceAttributes,
})
return permitted
} catch (error) {
console.error('Permission check failed:', error)
return false
}
}
Server actions use the Permit.io SDK to check permissions before performing operations:
export async function createDocument(data: { title: string; content: string; isPublic: boolean }, userId: string) {
// Check if user has permission to create documents
const hasPermission = await checkPermission(
userId,
ACTIONS.CREATE,
RESOURCES.DOCUMENT
)
if (!hasPermission) {
throw new Error('You do not have permission to create documents')
}
// Create document...
}
The UI uses a simplified client-side permission check to determine what actions to show:
const canUpdateDocument = hasPermission(
user.role,
ACTIONS.UPDATE,
RESOURCES.DOCUMENT,
{ id: document.id, ownerId: document.ownerId, userId: user.id }
)
// Only show edit button if user has permission
{canUpdateDocument && (
<Button onClick={() => setIsEditing(true)}>
Edit
</Button>
)}
This project demonstrates how to implement fine-grained authorization in a Next.js application using Permit.io. By externalizing authorization, we can create more secure, maintainable, and flexible applications.
Set Up Your Environment
Fork
our repository to your GitHub account.Clone
your fork to your local machine.
Use the command git clone https://github.com/RS-labhub/Document_Management_System.git
.fix-login-bug
or add-user-profile-page
.Commit Your Changes
git commit -m "Fix login bug by updating auth logic"
.Submit a Pull Request
Review and Merge
$~$
Thank you for visting this Repo
If you like it, star ⭐ it