Loved by leading developers:
ABAC with Low Code
Powerful Attribute Based Access Control made simple
- Scale seamlessly from RBAC to ABAC as your permissions needs grow
- Save significant time and complexity versus building and maintaining yourself
- Simplify for your non technical stakeholders with no code interfaces available out of the box
- Gain flexibility beyond what is possible with RBAC with very little effort Address all of the different use cases for your customers with comprehensive controls
- Learn all about Attribute Based Access Control at permit.io/abac


Policy Editor Interface

Makes granting permissions as easy as checking a box
- Manage and edit your policies with in seconds instead of days
- Work with a simple UI, API, or directly with rego code.
- Enable multi-tenancy, RBAC, ABAC , ReBAC, and more with a single streamlined interface.
- Provide low-code/no-code interfaces for non-technical users.
- Ensure future requirements are met with policy as code.
- Get Git Ops support out-of-the-box
Decouple Policy from Code
Checking permissions is as easy as permit.check(). Integrate in your code, middelware, mesh, or API gateway- with ease.
if (await permit.check(user, "close", `doc:${doc.id}`)) {
// allowed to close issue
}Before
After
// Gather all the needed objects for the permission check
// Complete user object from DB (based on session object, only 3 DB queries...)
const user = new User(session);
const doc = new Document(undefined, undefined, session.url);
// The 'fancy' home-brewed auth-z layer (Someone wrote 3 years ago)
AllowedDocType allowedDocTypes = new AllowedDocType(user.role);
// Query Stripe for live data (hope it's not too slow)
const isPaying = (await stripeWrapper.get_billing_status(user.email)) == STRIPE_PAYING;
if (user.role == ADMIN ||
( user.geo == "US" &&
allowedDocTypes.includes(doc.type) &&
isPaying &&
user.role == EDITOR || user.role == VIEWER)){
// allow access
}if (await permit.check(user, "close", `doc:${doc.id}`)) {
// allowed to close issue
}permitted = await permit.check(user, "close", f"issue:{issue.id}")
if permitted:
# allowed to close issueBefore
After
# Gather all the needed objects for the permission check
# Complete user object from DB (based on session object, only 3 DB queries...)
user = User(session=session)
doc = Document(url=session.url)
# The 'fancy' home-brewed auth-z layer (Someone wrote 3 years ago)
allowed_doc_types = get_allowed_doc_types(user.role)
# Query Stripe for live data (hope it's not too slow)
is_paying = (await stripe_wrapper.get_billing_status(user.email)) == STRIPE_PAYING
if user.role == UserRole.ADMIN or
(user.geo == "US" and
doc.type in allowed_doc_types and
is_paying and
user.role == UserRole.EDITOR or user.role == UserRole.VIEWER):
# allow accesspermitted = await permit.check(user, "close", f"issue:{issue.id}")
if permitted:
# allowed to close issueboolean permitted = permit.check( user, "create", Resource.fromString("document") );
if (permitted) {
// allow access
}Before
After
// Gather all the needed objects for the permission check
// Complete user object from DB (based on session object, only 3 DB queries...)
User user = new User.Builder.fromSession(session);
Document doc = new Document.Builder().fromUrl(session.url);
// The 'fancy' home-brewed auth-z layer (Someone wrote 3 years ago)
AllowedDocType allowedDocTypes = new AllowedDocType(user.role);
// Query Stripe for live data (hope it's not too slow)
boolean isPaying = stripeWrapper.get_billing_status(user.email) == STRIPE_PAYING;
if (user.role == ADMIN ||
( user.geo == "US" &&
allowedDocTypes.includes(doc.type) &&
isPaying &&
user.role == EDITOR || user.role == VIEWER)){
// allow access
}
boolean permitted = permit.check( user, "create", Resource.fromString("document") );
if (permitted) {
// allow access
}Before
After
Before
After
bool permitted = await permit.Check(user.key, "create", "document");
if (permitted)
{
Console.Write("User is PERMITTED to create a document");
}Before
After
// Gather all the needed objects for the permission check
// Complete user object from DB (based on session object, only 3 DB queries...)
User user = new User.Builder.fromSession(session);
Document doc = new Document.Builder().fromUrl(session.url);
// The 'fancy' home-brewed auth-z layer (Someone wrote 3 years ago)
AllowedDocType allowedDocTypes = new AllowedDocType(user.role);
// Query Stripe for live data (hope it's not too slow)
bool isPaying = (await stripeWrapper.get_billing_status(user.email)) == STRIPE_PAYING;
if (user.role == ADMIN ||
( user.geo == "US" &&
allowedDocTypes.includes(doc.type) &&
isPaying &&
user.role == EDITOR || user.role == VIEWER))
{
Console.Write("User is PERMITTED to create a document");
}
bool permitted = await permit.Check(user.key, "create", "document");
if (permitted)
{
Console.Write("User is PERMITTED to create a document");
}Before
After
Before
After
Before
After
Slide to see your code before and after Permit.io
Leverage the Power of Open Source
Connect Seamlessly to Your Authentication
Bake-in authorization in minutes. Simply plug-in on top of your existing AuthN solution (e.g. Auth0, Cognito).
Join the Conversation
Ready to transform your authorization?
Start using Permit.io and get your permissions and access management set up in minutes.






