Implementing authorization for a Web3-based CMS
This is a submission for the Permit.io Authorization Challenge: Permissions Redefined What I Built I built a Web3-based CMS (Content Management System) designed for managing decentralized content like collections, banners, presale campaigns, and other on-chain/off-chain data. The CMS provides an admin dashboard where team members can log in using their crypto wallets and manage the platform’s content in a more structured and user-friendly way. The key problem it solves is the lack of permission control in many Web3 tools. Typically, dApps allow wallet login but don’t differentiate between users. In my CMS, I introduced fine-grained access control so that different roles (e.g., admin, content editor, viewer/analyst) have access only to the features relevant to them. This improves security, collaboration, and overall project maintainability — especially in teams working on Web3 marketplaces, launchpads, or NFT collections. By combining decentralized login with centralized permission logic, the CMS balances Web3 principles with real-world admin needs. Demo Live page: https://web3-cms-app.vercel.app Project Repo Github repository: https://github.com/longphanquangminh/web3-cms-fe My Journey When I started building a Web3 CMS, one of the core features I knew I needed was authorization. Since the app relies on wallet-based authentication, I couldn’t use traditional username/password systems or standard backend session management. Instead, I had to find a way to manage access control in a decentralized environment — where users log in with wallets and identities aren't stored in a typical user table. My goal was to support roles like "admin", "editor", and "viewer", and ensure that each role had access to the appropriate parts of the CMS. For example, only admins should be able to manage collections or settings, while editors might only be able to modify content. It sounds simple, but handling this securely and flexibly in a Web3 setup required some research. I faced a few challenges along the way: Mapping wallet addresses to roles without a central user database. Enforcing access rules on both frontend and backend (especially when much of the logic lives client-side). Keeping the system flexible enough to add more roles or change rules without constantly redeploying code. Using Permit.io for Authorization After evaluating a few options, I decided to use Permit.io to handle authorization. What I liked about Permit.io was that it gave me a way to define roles, resources, and actions externally — separate from my app logic. This separation made it easier to manage permissions over time and adapt as my CMS evolved. I used Permit.io’s CLI to: Define resource (like content) and actions (read, update, delete, create). Create roles (admin, editor, viewer) and associate them with policies. Assign policies to wallet addresses based on user roles. On the app side, I integrated Permit.io’s SDK to check whether a user is authorized before allowing them to perform certain actions or access specific pages. For example, before showing the “Edit Collection” button, I’d run a permission check to see if the current user is allowed to update the collection resource. This made the authorization logic easy to follow and more secure, since decisions were centralized and clearly defined. It also helped me avoid scattering hardcoded role checks throughout the app. What I Learned Working on this helped me understand the importance of clean separation between authentication and authorization — especially in a decentralized context. Web3 introduces new identity patterns, and pairing them with a permission management system like Permit.io helped me build a more scalable and maintainable CMS. If you're building a dApp or Web3 admin tool that requires role-based access control, I recommend considering a similar setup. Having a proper authorization layer early on can save a lot of headaches as your app grows.

This is a submission for the Permit.io Authorization Challenge: Permissions Redefined
What I Built
I built a Web3-based CMS (Content Management System) designed for managing decentralized content like collections, banners, presale campaigns, and other on-chain/off-chain data. The CMS provides an admin dashboard where team members can log in using their crypto wallets and manage the platform’s content in a more structured and user-friendly way.
The key problem it solves is the lack of permission control in many Web3 tools. Typically, dApps allow wallet login but don’t differentiate between users. In my CMS, I introduced fine-grained access control so that different roles (e.g., admin, content editor, viewer/analyst) have access only to the features relevant to them. This improves security, collaboration, and overall project maintainability — especially in teams working on Web3 marketplaces, launchpads, or NFT collections.
By combining decentralized login with centralized permission logic, the CMS balances Web3 principles with real-world admin needs.
Demo
- Live page: https://web3-cms-app.vercel.app
Project Repo
- Github repository: https://github.com/longphanquangminh/web3-cms-fe
My Journey
When I started building a Web3 CMS, one of the core features I knew I needed was authorization. Since the app relies on wallet-based authentication, I couldn’t use traditional username/password systems or standard backend session management. Instead, I had to find a way to manage access control in a decentralized environment — where users log in with wallets and identities aren't stored in a typical user table.
My goal was to support roles like "admin", "editor", and "viewer", and ensure that each role had access to the appropriate parts of the CMS. For example, only admins should be able to manage collections or settings, while editors might only be able to modify content. It sounds simple, but handling this securely and flexibly in a Web3 setup required some research.
I faced a few challenges along the way:
- Mapping wallet addresses to roles without a central user database.
- Enforcing access rules on both frontend and backend (especially when much of the logic lives client-side).
- Keeping the system flexible enough to add more roles or change rules without constantly redeploying code.
Using Permit.io for Authorization
After evaluating a few options, I decided to use Permit.io to handle authorization. What I liked about Permit.io was that it gave me a way to define roles, resources, and actions externally — separate from my app logic. This separation made it easier to manage permissions over time and adapt as my CMS evolved.
I used Permit.io’s CLI to:
- Define resource (like
content
) and actions (read
,update
,delete
,create
). - Create roles (
admin
,editor
,viewer
) and associate them with policies. - Assign policies to wallet addresses based on user roles.
On the app side, I integrated Permit.io’s SDK to check whether a user is authorized before allowing them to perform certain actions or access specific pages. For example, before showing the “Edit Collection” button, I’d run a permission check to see if the current user is allowed to update
the collection
resource.
This made the authorization logic easy to follow and more secure, since decisions were centralized and clearly defined. It also helped me avoid scattering hardcoded role checks throughout the app.
What I Learned
Working on this helped me understand the importance of clean separation between authentication and authorization — especially in a decentralized context. Web3 introduces new identity patterns, and pairing them with a permission management system like Permit.io helped me build a more scalable and maintainable CMS.
If you're building a dApp or Web3 admin tool that requires role-based access control, I recommend considering a similar setup. Having a proper authorization layer early on can save a lot of headaches as your app grows.