This package has been deprecated

Author message:

Please use @knodes/nest-casl instead. See https://www.npmjs.com/package/@knodes/nest-casl

@scitizen/nest-casl
TypeScript icon, indicating that this package has built-in type declarations

0.0.2 • Public • Published

@scitizen/nest-casl

Nest Logo  +  CASL Logo

A simple decorator-based way to check CASL abilities on NestJS controllers.

GitHub issues NPM version NPM downloads License CircleCI CodeClimate maintainability CodeClimate test coverage

Description

Use decorators everywhere to protect your controller methods.

Installation

npm install --save @scitizen/nest-casl

Additionally, please make sure you have correct peer dependencies installed:

npm install @casl/ability@^5.0.0 @nestjs/common@^8.0.0 @nestjs/core@^8.0.0 lodash@^4.17.0 reflect-metadata@^0.1.13 rxjs@^7.0.0

In a nutshell

Declare a new service that converts the user of your request to a CASL ability:

import { Injectable } from '@nestjs/common';
import { AbilityBuilder, PureAbility } from '@casl/ability';
import { CaslAbilityFactory } from '@scitizen/nest-casl';

@Injectable()
export class AbilityFactory implements CaslAbilityFactory {
	// Here, `request` is the express or fastify request. You might get infos from it.
	public createFromRequest( _request: unknown ): PureAbility {
		const abilityBuilder = new AbilityBuilder( PureAbility );
		abilityBuilder.can( 'feed', 'cat' );
		abilityBuilder.can( 'hug', 'cat' );
		abilityBuilder.can( 'pet', 'cat' );
		abilityBuilder.cannot( 'rename', 'cat' );
		return abilityBuilder.build();
	}
}

Import the module:

import { Module } from '@nestjs/common';
import { CaslModule } from '@scitizen/nest-casl';

@Module( {
	imports: [
		CaslModule.withConfig( ( { abilityFactory: AbilityFactory } ) ),
		// ....
	],
} )
export class AppModule {}

Use decorators in your controller:

import { AbilityBuilder, PureAbility } from '@casl/ability';
import { Controller, Get } from '@nestjs/common';
import { InjectAbility, PoliciesMask, Policy } from '@scitizen/nest-casl';

@Controller( '/cat/care' )
@PoliciesMask({
	'pet': { action: 'pet', subject: 'cat' }
})
export class CatCareController {
	// Okay, you can feed.
	@Get( 'feed' )
	@Policy( { action: 'feed', subject: 'cat' } )
	public feed(){
		// ...
	}

	// Well, I guess he won't bite.
	@Get( 'hug' )
	@Policy( { action: 'hug', subject: 'cat' } )
	public hug(){
		// ...
	}

	@Get( 'pet' )
	public pet( @InjectAbility() ability: PureAbility ){
		// ...
	}
}

For more details and usage with guards, please refer to the guide.

License

@scitizen/nest-casl is MIT licensed.

Readme

Keywords

none

Package Sidebar

Install

npm i @scitizen/nest-casl

Weekly Downloads

0

Version

0.0.2

License

MIT

Unpacked Size

204 kB

Total Files

67

Last publish

Collaborators

  • gerkin