All Projects → Aclify → Aclify

Aclify / Aclify

Licence: mit
🔒 Node Access Control Lists (ACL).

Programming Languages

typescript
32286 projects

Projects that are alternatives of or similar to Aclify

Typescript Express Starter
🚀 TypeScript Express Starter
Stars: ✭ 238 (+385.71%)
Mutual labels:  sequelize, mysql, mongodb, postgresql, express
Chartbrew
Open-source web platform for creating charts out of different data sources (databases and APIs) 📈📊
Stars: ✭ 199 (+306.12%)
Mutual labels:  api, mysql, mongodb, postgresql
Blog Service
blog service @nestjs
Stars: ✭ 188 (+283.67%)
Mutual labels:  api, redis, mongodb, express
Zxw.framework.netcore
基于EF Core的Code First模式的DotNetCore快速开发框架,其中包括DBContext、IOC组件autofac和AspectCore.Injector、代码生成器(也支持DB First)、基于AspectCore的memcache和Redis缓存组件,以及基于ICanPay的支付库和一些日常用的方法和扩展,比如批量插入、更新、删除以及触发器支持,当然还有demo。欢迎提交各种建议、意见和pr~
Stars: ✭ 691 (+1310.2%)
Mutual labels:  mysql, redis, mongodb, postgresql
Endb
Key-value storage for multiple databases. Supports MongoDB, MySQL, Postgres, Redis, and SQLite.
Stars: ✭ 208 (+324.49%)
Mutual labels:  mysql, redis, mongodb, postgresql
Node Express Postgresql Sequelize
Node.js, Express.js, Sequelize.js and PostgreSQL RESTful API
Stars: ✭ 148 (+202.04%)
Mutual labels:  api, sequelize, postgresql, express
Phalcon Vm
Vagrant configuration for PHP7, Phalcon 3.x and Zephir development.
Stars: ✭ 43 (-12.24%)
Mutual labels:  mysql, redis, mongodb, postgresql
Express Graphql Mongodb Boilerplate
A boilerplate for Node.js apps / GraphQL-API / Authentication from scratch - express, graphql - (graphql compose), mongodb (mongoose).
Stars: ✭ 288 (+487.76%)
Mutual labels:  api, redis, mongodb, express
Yiigo
🔥 Go 轻量级开发通用库 🚀🚀🚀
Stars: ✭ 304 (+520.41%)
Mutual labels:  mysql, redis, mongodb, postgresql
Netkiller.github.io
Netkiller Free ebook - 免费电子书
Stars: ✭ 861 (+1657.14%)
Mutual labels:  mysql, redis, mongodb, postgresql
Treefrog Framework
TreeFrog Framework : High-speed C++ MVC Framework for Web Application
Stars: ✭ 885 (+1706.12%)
Mutual labels:  mysql, redis, mongodb, postgresql
Pifpaf
Python fixtures and daemon managing tools for functional testing
Stars: ✭ 161 (+228.57%)
Mutual labels:  mysql, redis, mongodb, postgresql
Node Express Mongodb Jwt Rest Api Skeleton
This is a basic API REST skeleton written on JavaScript using async/await. Great for building a starter web API for your front-end (Android, iOS, Vue, react, angular, or anything that can consume an API). Demo of frontend in VueJS here: https://github.com/davellanedam/vue-skeleton-mvp
Stars: ✭ 603 (+1130.61%)
Mutual labels:  api, redis, mongodb, express
Express Mongodb Rest Api Boilerplate
A boilerplate for Node.js apps / Rest API / Authentication from scratch - express, mongodb (mongoose).
Stars: ✭ 153 (+212.24%)
Mutual labels:  api, redis, mongodb, express
Spring Boot 2.x Examples
Spring Boot 2.x code examples
Stars: ✭ 104 (+112.24%)
Mutual labels:  mysql, redis, mongodb, postgresql
Jianshu
仿简书nx+nodejs+nestjs6+express+mongodb+angular8+爬虫
Stars: ✭ 296 (+504.08%)
Mutual labels:  api, redis, mongodb, express
Shell
Infrastructure Management Shell - Linux
Stars: ✭ 381 (+677.55%)
Mutual labels:  mysql, redis, mongodb, postgresql
Dev Setup
macOS development environment setup: Easy-to-understand instructions with automated setup scripts for developer tools like Vim, Sublime Text, Bash, iTerm, Python data analysis, Spark, Hadoop MapReduce, AWS, Heroku, JavaScript web development, Android development, common data stores, and dev-based OS X defaults.
Stars: ✭ 5,590 (+11308.16%)
Mutual labels:  mysql, redis, mongodb, postgresql
Nodeapi
Simple RESTful API implementation on Node.js + MongoDB.
Stars: ✭ 719 (+1367.35%)
Mutual labels:  api, mongodb, express
Bifrost
Bifrost ---- 面向生产环境的 MySQL 同步到Redis,MongoDB,ClickHouse,MySQL等服务的异构中间件
Stars: ✭ 701 (+1330.61%)
Mutual labels:  mysql, redis, mongodb

@aclify/aclify

Aclify

Dependencies Coverage Build Status MIT License PRs Welcome

Description

This module provides a Node Access Control Lists implementation inspired by Zend_ACL and node_acl package.

When you develop a web site or application you will soon notice that sessions are not enough to protect all the available resources. Avoiding that malicious users access other users content proves a much more complicated task than anticipated. ACL can solve this problem in a flexible and elegant way.

Create roles and assign roles to users. Sometimes it may even be useful to create one role per user, to get the finest granularity possible, while in other situations you will give the asterisk permission for admin kind of functionality.

Install

$ yarn add @aclify/aclify

Features

  • Users
  • Roles
  • Hierarchies
  • Resources
  • Express middleware for protecting resources.
  • Robust implementation with good unit test coverage.
  • Strict typing

Documentation

Stores

Aclify offers several possibilities to store your data:

  • Memory
  • Redis
  • MongoDB

Examples

Create your acl module by requiring it and instantiating it with a valid store instance:

From import

import * as Aclify from '@aclify/aclify';

// Using Redis store
const acl = new Aclify.Acl(new Aclify.RedisStore(RedisClient, {prefix: 'acl_'}));

// Or Using the Memory store
const acl = new Aclify.Acl(new Aclify.MemoryStore());

// Or Using the MongoDB store
const acl = new Aclify.Acl(new Aclify.MongoDBStore(db, {prefix: 'acl_'}));

All the following functions return a Promise.

Create roles implicitly by giving them permissions:

// guest is allowed to view blogs
await acl.allow('guest', 'blogs', 'view');

// allow function accepts arrays as any parameter
await acl.allow('member', 'blogs', ['edit', 'view', 'delete']);

Users are likewise created implicitly by assigning them roles:

await acl.addUserRoles('joed', 'guest');

Hierarchies of roles can be created by assigning parents to roles:

await acl.addRoleParents('baz', ['foo', 'bar']);

Note that the order in which you call all the functions is irrelevant (you can add parents first and assign permissions to roles later)

await acl.allow('foo', ['blogs', 'forums', 'news'], ['view', 'delete']);

Use the wildcard to give all permissions:

await acl.allow('admin', ['blogs', 'forums'], '*');

Sometimes is necessary to set permissions on many different roles and resources. This would lead to unnecessary nested callbacks for handling errors. Instead use the following:

await acl.allow([
    {
        roles:['guest', 'member'],
        allows:[
            {resources:'blogs', permissions:'get'},
            {resources:['forums', 'news'], permissions:['get', 'put', 'delete']}
        ]
    },
    {
        roles:['gold', 'silver'],
        allows:[
            {resources:'cash', permissions:['sell', 'exchange']},
            {resources:['account', 'deposit'], permissions:['put', 'delete']}
        ]
    }
]);

You can check if a user has permissions to access a given resource with isAllowed:

const isAllowed = await acl.isAllowed('joed', 'blogs', 'view');

if (isAllowed) {
    console.log("User Joed is allowed to view blogs");
}

Of course arrays are also accepted in this function:

await acl.isAllowed('jsmith', 'blogs', ['edit', 'view', 'delete'])

Note that all permissions must be fulfilled in order to get true.

Sometimes is necessary to know what permissions a given user has over certain resources:

const permissions = await acl.allowedPermissions('james', ['blogs', 'forums']);

It will return an array of resource:[permissions] like this:

[
  {
    blogs: ['get', 'delete']
  },
  {
    forums:['get', 'put']
  }
 ]

Finally, we provide a middleware for Express for easy protection of resources.

acl.middleware()

We can protect a resource like this:

app.put('/blogs/:id', acl.middleware(), function(req, res, next) {...}

The middleware will protect the resource named by req.url, pick the user from req.session.userId and check the permission for req.method, so the above would be equivalent to something like this:

await acl.isAllowed(req.session.userId, '/blogs/12345', 'put')

The middleware accepts 3 optional arguments, that are useful in some situations. For example, sometimes we cannot consider the whole url as the resource:

app.put('/blogs/:id/comments/:commentId', acl.middleware(3), function(req, res, next) {}

In this case the resource will be just the three first components of the url (without the ending slash).

It is also possible to add a custom userId or check for other permissions than the method:

app.put('/blogs/:id/comments/:commentId', acl.middleware(3, 'joed', 'post'), function(req, res, next) {}

Methods

addUserRoles( userId, roles )

Adds roles to a given user id.

Arguments

    userId  {String|Number} User id.
    roles   {String|Array} Role(s) to add to the user id.

removeUser( userId )

Remove user.

Arguments

    userId  {String|Number} User id.

removeUserRoles( userId, roles )

Remove roles from a given user.

Arguments

    userId  {String|Number} User id.
    roles   {String|Array} Role(s) to remove to the user id.

userRoles( userId )

Return all the roles from a given user.

Arguments

    userId  {String|Number} User id.

roleUsers( rolename )

Return all users who has a given role.

Arguments

    rolename  {String|Number} User id.

hasRole( userId, rolename )

Return boolean whether user has the role

Arguments

    userId    {String|Number} User id.
    rolename  {String|Number} role name.

addRoleParents( role, parents )

Adds a parent or parent list to role.

Arguments

    role      {String} Child role.
    parents   {String|Array} Parent role(s) to be added.

removeRoleParents( role, parents )

Removes a parent or parent list from role.

If parents is not specified, removes all parents.

Arguments

    role      {String} Child role.
    parents   {String|Array} Parent role(s) to be removed [optional].

removeRole( role )

Removes a role from the system.

Arguments

    role  {String} Role to be removed

removeResource( resource )

Removes a resource from the system

Arguments

    resource  {String} Resource to be removed

allow( roles, resources, permissions )

Adds the given permissions to the given roles over the given resources.

Arguments

    roles         {String|Array} role(s) to add permissions to.
    resources     {String|Array} resource(s) to add permisisons to.
    permissions   {String|Array} permission(s) to add to the roles over the resources.

allow( permissionsArray )

Arguments

    permissionsArray  {Array} Array with objects expressing what permissions to give.
       [{roles: {String|Array}, allows: [{resources:{String|Array}, permissions:{String|Array}]]

removeAllow( role, resources, permissions )

Remove permissions from the given roles owned by the given role.

Note: we loose atomicity when removing empty role_resources.

Arguments

    role          {String}
    resources     {String|Array}
    permissions   {String|Array}

allowedPermissions( userId, resources )

Returns all the allowable permissions a given user have to access the given resources.

It returns an array of objects where every object maps a resource name to a list of permissions for that resource.

Arguments

    userId      {String|Number} User id.
    resources   {String|Array} resource(s) to ask permissions for.

isAllowed( userId, resource, permissions )

Checks if the given user is allowed to access the resource for the given permissions (note: it must fulfill all the permissions).

Arguments

    userId        {String|Number} User id.
    resource      {String} resource to ask permissions for.
    permissions   {String|Array} asked permissions.

areAnyRolesAllowed( roles, resource, permissions )

Returns true if any of the given roles have the right permissions.

Arguments

    roles         {String|Array} Role(s) to check the permissions for.
    resource      {String} resource to ask permissions for.
    permissions   {String|Array} asked permissions.

whatResources( role )

Returns what resources a given role has permissions over.

Arguments

    role  {String|Array} Roles

whatResources(role, permissions )

Returns what resources a role has the given permissions over.

Arguments

    role          {String|Array} Roles
    permissions   {String|Array} Permissions

middleware( [numPathComponents, userId, permissions] )

Middleware for express.

To create a custom getter for userId, pass a function(req, res) which returns the userId when called (must not be async).

Arguments

    numPathComponents   {Number} number of components in the url to be considered part of the resource name.
    userId              {String|Number|Function} the user id for the acl system (defaults to req.session.userId)
    permissions         {String|Array} the permission(s) to check for (defaults to req.method.toLowerCase())

Creates a new Redis store using Redis client client.

Tests

$ yarn test

Scripts

Run using yarn <script> command.

clean - Removes temporary files
build - Builds typescript files
build:watch - Builds typescript files in watch mode
lint - Checks lint
lint:fix - Auto lint fix
test - Runs tests in dockerized environment
test:coverage - Runs tests

License

MIT © Dimitri DO BAIRRO

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].