Skip to content

node-casbin/prisma-adapter

Repository files navigation

Prisma Adapter

NPM version NPM download Build Status Discord

Prisma Adapter is the Prisma adapter for Node-Casbin. With this library, Node-Casbin can load policy from Prisma supported database or save policy to it.

Based on Officially Supported Databases, the current supported databases are:

  • PostgreSQL
  • MySQL
  • SQLite
  • MongoDB

You may find other 3rd-party supported DBs in Prisma website or other places.

Installation

npm install casbin-prisma-adapter --save

Getting Started

Append the following content to your schema.prisma:

model CasbinRule {
  id    Int     @id @default(autoincrement())
  ptype String
  v0    String?
  v1    String?
  v2    String?
  v3    String?
  v4    String?
  v5    String?

  @@map("casbin_rule")
}

Create table(MySQL):

CREATE TABLE IF NOT EXISTS `casbin_rule` (
  `id` int NOT NULL AUTO_INCREMENT,
  `ptype` varchar(255) DEFAULT NULL,
  `v0` varchar(255) DEFAULT NULL,
  `v1` varchar(255) DEFAULT NULL,
  `v2` varchar(255) DEFAULT NULL,
  `v3` varchar(255) DEFAULT NULL,
  `v4` varchar(255) DEFAULT NULL,
  `v5` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

Here is a simple example:

import casbin from 'casbin';
import { PrismaAdapter } from 'casbin-prisma-adapter';

async function main() {
  const a = await PrismaAdapter.newAdapter();
  // Or:
  // const prisma = new PrismaClient();
  // const a = await PrismaAdapter.newAdapter(prisma);

  const e = await casbin.newEnforcer('examples/rbac_model.conf', a);

  // Check the permission.
  e.enforce('alice', 'data1', 'read');

  // Modify the policy.
  // await e.addPolicy(...);
  // await e.removePolicy(...);

  // Save the policy back to DB.
  await e.savePolicy();
}

main();

Using Custom Prisma Client Output Path (Prisma v7+)

If you're using a custom output path for your Prisma client (e.g., generating the client to ./src/generated/client), you must pass your PrismaClient instance to the adapter:

// schema.prisma
generator client {
  provider = "prisma-client-js"
  output   = "./src/generated/client"
}
import casbin from 'casbin';
import { PrismaAdapter } from 'casbin-prisma-adapter';
import { PrismaClient } from './src/generated/client'; // Your custom path

async function main() {
  const prisma = new PrismaClient();
  const a = await PrismaAdapter.newAdapter(prisma);

  const e = await casbin.newEnforcer('examples/rbac_model.conf', a);

  // Check the permission.
  e.enforce('alice', 'data1', 'read');

  // Save the policy back to DB.
  await e.savePolicy();
}

main();

Important: When using custom output paths, you must always pass a PrismaClient instance to the adapter. The adapter will attempt to dynamically import from @prisma/client only when no instance is provided and the adapter is initialized.

Getting Help

License

This project is under Apache 2.0 License. See the LICENSE file for the full license text.