Skip to content

platformatic/fastify-cerbos

Repository files navigation

Cerbos Fastify plugin

This plugin provides a Fastify plugin for Cerbos. Currently, this supports only isAllowed exposed by a Fastify request decorator, which returns a Promise that resolves to a boolean.

It assumes the request has been decorated with a user object. The user object is used to extract the principal using this getPrincipal function:

  getPrincipal: user => {
    const { id = 'anonymous', roles = ['anonymous'], ...rest } = user
    return {
    id,
    roles, 
    attr: rest
  }
}

This function can be overridden by passing a getPrincipal function to the plugin options. If no user object is found in the request, the principal is anonymous principal:

  { 
    id: 'anonymous', 
    roles: ['anonymous'] 
  }

These values are also set in case user as no id or roles properties.

Usage

Install with:

npm install fastify-cerbos

Then you can add the plugin to your Fastify application:

const Fastify = require('fastify')
const fastifyCerbos = require('fastify-cerbos')

const app = Fastify()

app.register(fastifyCerbos, {
  host: '127.0.0.1',
  port: 3593,
  useGRPC: true,
})

app.get('/', async function (request, reply) {

  const { id } = request.body
  const resource = {
    id,
    kind: 'post',
    attr: {}
  }
  
  const allowed = await request.isAllowed(resource, 'modify')
  if (!allowed) {
    reply.code(403).send()
  }
  
  // (...)
})

await app.listen()

Options

The plugin accepts the following options:

  • host - Cerbos server host. Default: 127.0.0.1
  • port - Cerbos server port. Default: 3593
  • useGRPC - Use gRPC to connect to Cerbos server. Default: true
  • getPrincipal - Function to extract the principal from the request. Default: see above
  • tls - TLS options for gRPC/HTTP connection. This object is passed to Cerbos Client Object

Run Tests

Make sure you have Docker and docker-compose installed.

Start Cerbos server with:

docker-compose up -d