2.1.3 • Published 5 years ago

principal-js v2.1.3

Weekly downloads
1
License
MIT
Repository
github
Last release
5 years ago

principal-js

fine-grained permission control system

Motivation

provides a utility to make human-readable permission controls:

  • action(verb)
  • object(noun)
  • decoration(adjective)

Installation

$ npm i principal-js

Usage

esm way

import { principal, permission } from 'principal-js'

commonjs way

const { principal, permission } = require('principal-js')

How it looks like?

import { principal, permission } from 'principal-js'

principal
  // these could be loaded from configuations
  .addAction('edit')
  .addAction('create', '', 'edit')
  .addObject('blog')
  .addDecoration('in3Days')
  // this is per-user settings
  .setScope('create.blog')

// I can create blog, and create inherits edit, so I can edit blog
principal.can('edit.blog').should.be.true

// or you could utilize the action object
let {create} = principal.actions

permission(
  create.blog.in3Days,
  create.blog
).can().should.be.true

What is a need?

A need is composed of:

  • action
  • object
  • decorations

let us look at some examples:

  • edit.blog
  • edit.blog.in3Days
  • edit.blog.in3Days.ofMyOwn

An action could inherit other action, for example edit inherits view

An need (say a) will pass another need (say b) if:

  • a's action is the same as or inherits b's
  • a's object is the same as b's
  • a's decorations is empty of contained by b's

Let us look at some examples:

  • edit.blog passes edit.blog.in3Days
  • edit.blog passes view.blog
  • edit.blog passes view.blog.in3Days
  • edit.blog.in3Days won't pass edit.blog.ofMyOwn
  • edit.blog.ofMyOwn passes edit.blog.ofMyOwn.in3Days
  • edit.blog.ofMyOwn won't pass view.blog.in3Days
  • edit.blog.ofMyOwn won't pass edit.blog.in3Days, vice versa

please check the test directory to get more examples.

Development

$ git clone https://github.com/hzwellliving/principal-js.git
$ cd principal-js
$ npm ci
$ npm run build
$ npm run test
2.1.3

5 years ago

2.2.0

6 years ago

2.1.2

6 years ago

2.1.1

6 years ago

2.1.0

6 years ago

2.0.2

6 years ago

2.0.1

6 years ago

2.0.0

6 years ago

1.1.1

6 years ago

1.1.0

6 years ago

1.0.0

6 years ago