Skip to content

Ember addon for CASL which makes it easy to add permissions in any Ember application

License

Notifications You must be signed in to change notification settings

concordnow/ember-casl

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ember-casl

Build Status Ember Observer Score

Ember addon for CASL which makes it easy to add permissions in any Ember application.

This package allows to integrate @casl/ability with Ember application.

It provides:

  • Ability service that allows you to define CASL ability compatible with Ember tracked properties.
  • Can/Cannot component that allow to hide or show UI elements based on user ability to see them.

Compatibility

  • Ember.js v3.20 or above
  • Ember CLI v3.20 or above
  • Node.js v12 or above
  • ember-auto-import v2.0 or above

Installation

ember install ember-casl

Usage

Ability Service

Define ability like regular Ember services by extending AbilityService.

// services/post-ability.js
import { tracked } from '@glimmer/tracking';
import AbilityService from 'ember-casl/services/ability';

export default class PostAbility extends AbilityService {
  @tracked isWriter = false;

  get definition() {
    return ({ can, cannot }) => {
      can('read', 'post');
      if (this.isWriter) {
        can('write', 'post');
      } else {
        cannot('write', 'post').because("You're not a writer");
      }
    };
  }
}

The definition getter should return a function taking destructured AbilityBuilder as argument (build excluded).

It allows you to define very complex reactive ability (eg. Ability based on tracked property or another service).

Your newly created Ability service expose some fields

Name Type Description
ability CASL Ability Original CASL Ability
can Method Wrapper on CASL Ability method can
cannot Method Wrapper on CASL Ability method cannot
relevantRuleFor Method Wrapper on CASL Ability method relevantRuleFor

Then you can use those abilities as regular services in your Ember application.

// components/dummy.js
import Component from '@glimmer/component';
import { inject as service } from '@ember/service';

export default class DummyComponent extends Component {
  @service postAbility;

  get canRead() {
    return this.postAbility.can('read', 'post');
  }

  get cannotWriteReason() {
    return this.postAbility.relevantRuleFor('write', 'post').reason;
  }
}

Can / Cannot Helpers

You can use can & cannot helpers in your templates.

{{#if (can 'read' 'post' service='post-ability')}}
  <span>You're a reader</span>
{{/if}}
{{#if (cannot 'write' 'post' service='post-ability')}}
  <span>You're not a writer</span>
{{/if}}

Positional params are CASL Ability can / cannot arguments. service is the name of the Ember service.

Contributing

See the Contributing guide for details.

License

This project is licensed under the MIT License.