Implement fine-grained roles and permissions for Express with Cerbos
Before
After
Express is an open source server environment popular for creating Node.js applications. Cerbos is an open source, self-hosted, authorization service for implementing roles and permissions. Integrating Cerbos with Express has the following benefits:
Follow these steps to implement Cerbos in your Express application: on:
Cerbos binaries are available for various operating systems and architectures. For a list of all available downloads, please visit our releases page on GitHub. It is common to use Docker to run the Cerbos in a container.
Available here.
Then your application can send access control requests to the Cerbos server.
Signing up to Cerbos Hub is free and makes it easier to work collaboratively on authorization with teammates and centralize authorization management. When you sign up you will be prompted to create an organization and a workspace, to which you will connect a Github repository.
Before your Express application is able to enforce access control policies you will need to define those policies in Cerbos. If you signed up to Cerbos Hub there are built-in tools to help you write and test your policies. You can also create your own policy repository. Cerbos policies are written in YAML, and define the principals, resources, and configuration associated with your authorization logic.
Replace the authorization logic in your Node.js app with a call to Cerbos.
Find a full tutorial here.
The code below demonstrates how to setup the Cerbos SDK and check permissions inside a GET Express handler.
import express from "express";
import { GRPC as Cerbos } from "@cerbos/grpc";
// Connect to the Cerbos PDP Instance
const cerbos = new Cerbos("localhost:3592");
const app = express();
app.get("/expenses/:id", async (req, res) => {
// Get the resource from the DB
const result = expenses.find((expense) => expense.id === req.params.id);
if (!result) return res.status(404).json({ error: "Expense not found" });
// Pass the user (principal) and the resource to
// Cerbos along with the action to perform
const decision = await cerbos.checkResource({
principal: {
id: req.user.id,
roles: req.user.roles,
attributes: req.user
}
resource: {
kind: "expense",
id: result.id,
attributes: {
...result,
}
},
actions: ["view"],
});
// Check whether a particular action is allowed
if (decision.isAllowed("view")) {
return res.json(result);
} else {
return res.status(401).json({ error: "Unauthorized" });
}
});
Cerbos is open source, decoupled access control for your application enabling you to implement fine-grained permissions in minutes.
Define and evolve complex policies without requiring a release cycle
Meet your compliance requirements with a full audit trail of policies, permissions, access to resources
Be enterprise ready and meet your customer's organizational requirements with ease
Coming soon: SIEM integrations and anomaly detection and recommendations of policy changes
Fine grained access controls extending the roles defined in Express
Request time attribute based authorization enables more contextual access controls
Independent authorization logic avoids bloated tokens and workarounds
Define access policies using human-readable YAML. No need to master a new policy language.
Dynamically derive new roles based on contextual information. Don't be limited to what your IdP provides.
Make use of context such as IP address and time of day to make realtime access decisions
Access decisions in milliseconds.
Develop, test, and deploy policies just as you do with your source code.
Built-in policy versioning to support canary deployments and different environments.
Containerised deployment as a microservice or a sidecar. REST and gRPC interfaces. Top-notch observability.
Capture every decision and analyze them later.
Leverage our community for examples and help.
Book a free Policy Workshop to discuss your requirements and get your first policy written by the Cerbos team