Socket
Book a DemoInstallSign in
Socket

@yaacl/hapi

Package Overview
Dependencies
Maintainers
1
Versions
13
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@yaacl/hapi

YAACL integration for hapi

latest
Source
npmnpm
Version
1.0.1
Version published
Maintainers
1
Created
Source

YAACL - Hapi Integration

Provides a plugin for hapi to integrate yaacl on route and/or handler level.

Install yarn add @yaacl/core @yaacl/hapi @yaacl/memory-adapter or use @yaacl/mongoose-adapter instead.

import { Privileges } from '@yaacl/core';
import { MemoryAdapter } from '@yaacl/memory-adapter';
import * as Hapi from 'hapi';
import { forbidden } from 'boom';

// ...setup server

// normally these would come from the session for example.
const exampleIdentities = [
  {
    getSecurityId: () => 'user-1',
  },
  {
    getSecurityId: () => 'user-2',
  },
];

// register plugin on server
await server.register({
  plugin,
  options: {
    adapter: new MemoryAdapter(),
    securityIdentityResolver: request => {
      // return one or an array of SecurityIdentity objects
      // which you can generate from request data.
      return exampleIdentities;
    },
  },
});

// setting privileges on a route activates acl
// for the path/method of the route.
const securedRoute = server.route({
  path: '/secured',
  method: 'get',
  options: {
    plugins: {
      yaacl: {
        privileges: Privileges.READ,
      },
    },
  },
  handler: () => 'Seems like you have access to this site!',
});

// instead of using the path/method as identity,
// you can define groups.
const adminRoutes = [
  {
    path: '/admin/list',
    method: 'get',
    options: {
      plugins: {
        yaacl: {
          group: 'admins',
          privileges: Privileges.READ,
        },
      },
    },
    handler: () => 'Seems like you have access to this site!',
  },
  {
    path: '/admin/delete',
    method: 'get',
    options: {
      plugins: {
        yaacl: {
          group: 'admins',
          privileges: Privileges.READ | Privileges.REMOVE,
        },
      },
    },
    handler: request => {
      // for more fine grained checks, you have access to yaacl inside of handlers too!
      const granted = await request.server.plugins.yaacl.api.isGranted(
        exampleIdentities[0],
        someOtherObjectIdentity,
        Privileges.REMOVE,
      );

      if (granted) {
        // you also have access to the actual resolved securityIdentity and objectIdentity
        // through request.plugins.yaacl!
        const { securityIdentity, objectIdentity } = request.plugins.yaacl;

        return `Deleted ${objectIdentity.getSecurityId()} by ${objectIdentity.getObjectId()}`;
      }

      throw forbidden();
    },
  },
];

// add the routes of course!
server.route([...adminRoutes, securedRoute]);

// to set privileges for routes, use the plugin helper to turn a route into an object identity.
await server.plugins.yaacl.api.grant(
  exampleIdentities[0],
  server.plugins.yaacl.getRouteIdentity(securedRoute),
);

For a more detailed documentation please visit our Wiki.

Keywords

acl

FAQs

Package last updated on 19 Mar 2019

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts