SlideShare a Scribd company logo
1 of 36
Download to read offline
CASL
Isomorphic Permission Management
Who am I and what I do here?
Experience:
● working from dark times of IE6
● PHP, Ruby, Nodejs, ~Java and .NET Core
Hobbies:
● chess, books
● articles , open source contribution
CASL. Isomorphic permission management
What? CASL?
Why CASL?
ACL
Why CASL?
<div v-if="user.role === 'admin' || post.authorId ===
user.id">
<button @click="publish">Publish</button>
</div>
Why CASL?
<div v-if="user.role === 'admin' || user.role ===
'moderator' || post.authorId === user.id">
<button @click="publish">Publish</button>
</div>
Why CASL?
Why CASL?
<div v-if="can('publish')">
<button @click="publish">Publish</button>
</div>
Why CASL?
<div v-if="can('publish', 'Post')">
<button @click="publish">Publish</button>
</div>
Story telling
How to CASL
Evolve ACL as requirements evolve1
What’s special in CASL?
Declarative configuration2
In-memory validation and database queries3
MongoDB-like conditions4
Serializable rules5
How to CASLHow to CASLHow to CASL
How to CASLPermissions: admin
can manage all
How to CASLPermissions: writer
can create Article
can read Article
where published = true
can read, update Article
where author = me
can delete, publish Article
where author = me and published = false
can read, update User
where id = me
How to CASLPermissions: unauthenticated
can read Article
where published = true
How to CASLCASL: admin
can('manage', 'all')
How to CASLCASL: admin
import { AbilityBuilder } from '@casl/ability'
const { can } = AbilityBuilder.extract()
can('manage', 'all')
How to CASLCASL: writer
can('create', 'Article')
can('read', 'Article', {
published: true
})
can(['read', 'update'], 'Article', {
authorId: user.id
})
can(['delete', 'publish'], 'Article', {
authorId: user.id,
published: false
})
can(['read', 'update'], 'User', {
id: user.id
})
How to CASLCASL: unauthenticated
can('read', 'Article', { published: true })
How to CASLCASL validation: seeds
const myUser = new User({ id: 1, email: 'writer@casl.io' })
const myDraft = new Article({ authorId: myUser.id, published: false })
const myArticle = new Article({ authorId: myUser.id, published: true })
How to CASLCASL validation: seeds
const anotherUser = new User({ email: 'another.writer@casl.io' })
const anotherDraft = new Article({ ... })
const anotherArticle = new Article({ ... })
How to CASLCASL validation: admin
import { Ability } from '@casl/ability'
import { rulesForAdmin } from './rules'
const ability = new Ability(rulesForAdmin())
ability.can('read', 'Article') // true
ability.can('read', 'User') // true
ability.can('read', myArticle) // true
How to CASLCASL validation: writer
const ability = new Ability(rulesForWriter(myUser))
ability.can('create', 'Article') // true
ability.can('read', anotherDraft) // false
ability.can('read', anotherArticle) // true
ability.can('read', myDraft) // true
ability.can('read', myArticle) // true
How to CASLCASL validation: unauthenticated
const ability = new Ability(rulesForAnonymous())
ability.can('read', 'Article') // true
ability.can('read', anotherArticle) // true
ability.can('read', anotherUser) // false
ability.can('read', anotherDraft) // false
ability.can('create', 'Article') // false
How to CASLCASL Demo
Vue app Express API
How to CASLCASL Alternatives
Downloads
/ month
Github
stars
Size
(gzip)
Last updated Tree
shaking
Instance
validation
Attribute
validation
DB
Queries
@casl/ability 105k 1.6k 3.9K 2 weeks ago Yes Yes Yes Yes
acl 31k 2.3k 56.6K 2 years ago No No No No
accesscontrol 44k 965 7.7K 10 months ago Maybe No Yes No
connect-roles 20k 704 5.2K 9 months ago No No No No
casbin 16k 670 34.6K 2 months ago Maybe Yes Yes No
cancan 1.7k 578 985 1 year ago No Yes No No
How to CASLCASL Alternatives
THERE IS NO MAGIC HERE
How to CASLNo Magic Behind!
SQL joins1
Synchronous2
Specification pattern3
How to CASLWhat else?
NO
ROLES
IN MY
ACL
How to CASLWhat else? Feature flags
How to CASLWhat else? Hardware capabilities
How to CASLWhat else? Business logic
async function rulesForUser(user) {
const { rules, can, cannot } = AbilityBuilder.extract()
can('read', 'Post')
if (user.hasActiveSubscription()) {
can('update', 'Post', { userId: user.id })
} else {
cannot('update', 'Post')
.because('Your subscription has been expired')
}
return rules
})
CASL
Isomorphic Permission Management
Sergii Stotskyi
sergiy.stotskiy@gmail.com
?

More Related Content

What's hot

Railsbridge javascript
Railsbridge   javascriptRailsbridge   javascript
Railsbridge javascript
p4geoff
 

What's hot (20)

JavaScript and jQuery Basics
JavaScript and jQuery BasicsJavaScript and jQuery Basics
JavaScript and jQuery Basics
 
Requirejs
RequirejsRequirejs
Requirejs
 
JQuery
JQueryJQuery
JQuery
 
OUTDATED (Encore)
OUTDATED (Encore)OUTDATED (Encore)
OUTDATED (Encore)
 
Managing JavaScript Dependencies With RequireJS
Managing JavaScript Dependencies With RequireJSManaging JavaScript Dependencies With RequireJS
Managing JavaScript Dependencies With RequireJS
 
AngulrJS Overview
AngulrJS OverviewAngulrJS Overview
AngulrJS Overview
 
Styling Components with JavaScript: MelbCSS Edition
Styling Components with JavaScript: MelbCSS EditionStyling Components with JavaScript: MelbCSS Edition
Styling Components with JavaScript: MelbCSS Edition
 
Styling components with JavaScript
Styling components with JavaScriptStyling components with JavaScript
Styling components with JavaScript
 
Railsbridge javascript
Railsbridge   javascriptRailsbridge   javascript
Railsbridge javascript
 
Introducing jQuery
Introducing jQueryIntroducing jQuery
Introducing jQuery
 
Black-Scholes Calculator on Web
Black-Scholes Calculator on WebBlack-Scholes Calculator on Web
Black-Scholes Calculator on Web
 
Sins Against Drupal 2
Sins Against Drupal 2Sins Against Drupal 2
Sins Against Drupal 2
 
In-depth changes to Drupal 8 javascript
In-depth changes to Drupal 8 javascriptIn-depth changes to Drupal 8 javascript
In-depth changes to Drupal 8 javascript
 
Meta Programming with JavaScript
Meta Programming with JavaScriptMeta Programming with JavaScript
Meta Programming with JavaScript
 
Обзор автоматизации тестирования на JavaScript
Обзор автоматизации тестирования на JavaScriptОбзор автоматизации тестирования на JavaScript
Обзор автоматизации тестирования на JavaScript
 
Client Side MVC & Angular
Client Side MVC & AngularClient Side MVC & Angular
Client Side MVC & Angular
 
Handlebars
HandlebarsHandlebars
Handlebars
 
jQuery in 15 minutes
jQuery in 15 minutesjQuery in 15 minutes
jQuery in 15 minutes
 
Drupal.js: Best Practices for Managing Javascript in Drupal
Drupal.js: Best Practices for Managing Javascript in DrupalDrupal.js: Best Practices for Managing Javascript in Drupal
Drupal.js: Best Practices for Managing Javascript in Drupal
 
Drupal sins 2016 10-06
Drupal sins 2016 10-06Drupal sins 2016 10-06
Drupal sins 2016 10-06
 

Similar to Casl. isomorphic permission management.pptx

Dependency Management with RequireJS
Dependency Management with RequireJSDependency Management with RequireJS
Dependency Management with RequireJS
Aaronius
 
Google apps script database abstraction exposed version
Google apps script database abstraction   exposed versionGoogle apps script database abstraction   exposed version
Google apps script database abstraction exposed version
Bruce McPherson
 

Similar to Casl. isomorphic permission management.pptx (20)

feature toggles for ops
feature toggles for opsfeature toggles for ops
feature toggles for ops
 
Backbone js
Backbone jsBackbone js
Backbone js
 
Webauthn Tutorial
Webauthn TutorialWebauthn Tutorial
Webauthn Tutorial
 
Demo how to create visualforce and apex controller to update, delete custom o...
Demo how to create visualforce and apex controller to update, delete custom o...Demo how to create visualforce and apex controller to update, delete custom o...
Demo how to create visualforce and apex controller to update, delete custom o...
 
Rails, Postgres, Angular, and Bootstrap: The Power Stack
Rails, Postgres, Angular, and Bootstrap: The Power StackRails, Postgres, Angular, and Bootstrap: The Power Stack
Rails, Postgres, Angular, and Bootstrap: The Power Stack
 
Transformando os pepinos do cliente no código de testes da sua aplicação
Transformando os pepinos do cliente no código de testes da sua aplicaçãoTransformando os pepinos do cliente no código de testes da sua aplicação
Transformando os pepinos do cliente no código de testes da sua aplicação
 
Reliable Javascript
Reliable Javascript Reliable Javascript
Reliable Javascript
 
Ruby on Rails testing with Rspec
Ruby on Rails testing with RspecRuby on Rails testing with Rspec
Ruby on Rails testing with Rspec
 
Dan Webb Presentation
Dan Webb PresentationDan Webb Presentation
Dan Webb Presentation
 
Tutorial asp.net
Tutorial  asp.netTutorial  asp.net
Tutorial asp.net
 
Creating Gradle Plugins - Oredev
Creating Gradle Plugins - OredevCreating Gradle Plugins - Oredev
Creating Gradle Plugins - Oredev
 
Frontin like-a-backer
Frontin like-a-backerFrontin like-a-backer
Frontin like-a-backer
 
Controller Testing: You're Doing It Wrong
Controller Testing: You're Doing It WrongController Testing: You're Doing It Wrong
Controller Testing: You're Doing It Wrong
 
Introduction to backbone presentation
Introduction to backbone presentationIntroduction to backbone presentation
Introduction to backbone presentation
 
Uniface Lectures Webinar - Building Responsive Applications with Uniface: Dev...
Uniface Lectures Webinar - Building Responsive Applications with Uniface: Dev...Uniface Lectures Webinar - Building Responsive Applications with Uniface: Dev...
Uniface Lectures Webinar - Building Responsive Applications with Uniface: Dev...
 
Introduce cucumber
Introduce cucumberIntroduce cucumber
Introduce cucumber
 
Mojolicious
MojoliciousMojolicious
Mojolicious
 
Dependency Management with RequireJS
Dependency Management with RequireJSDependency Management with RequireJS
Dependency Management with RequireJS
 
Google apps script database abstraction exposed version
Google apps script database abstraction   exposed versionGoogle apps script database abstraction   exposed version
Google apps script database abstraction exposed version
 
Aplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com BackboneAplicacoes dinamicas Rails com Backbone
Aplicacoes dinamicas Rails com Backbone
 

Recently uploaded

一比一原版犹他大学毕业证如何办理
一比一原版犹他大学毕业证如何办理一比一原版犹他大学毕业证如何办理
一比一原版犹他大学毕业证如何办理
F
 
Russian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
Russian Escort Abu Dhabi 0503464457 Abu DHabi EscortsRussian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
Russian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
Monica Sydney
 
Indian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Indian Escort in Abu DHabi 0508644382 Abu Dhabi EscortsIndian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Indian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Monica Sydney
 
一比一原版(Offer)康考迪亚大学毕业证学位证靠谱定制
一比一原版(Offer)康考迪亚大学毕业证学位证靠谱定制一比一原版(Offer)康考迪亚大学毕业证学位证靠谱定制
一比一原版(Offer)康考迪亚大学毕业证学位证靠谱定制
pxcywzqs
 
pdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
pdfcoffee.com_business-ethics-q3m7-pdf-free.pdfpdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
pdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
JOHNBEBONYAP1
 
Abu Dhabi Escorts Service 0508644382 Escorts in Abu Dhabi
Abu Dhabi Escorts Service 0508644382 Escorts in Abu DhabiAbu Dhabi Escorts Service 0508644382 Escorts in Abu Dhabi
Abu Dhabi Escorts Service 0508644382 Escorts in Abu Dhabi
Monica Sydney
 
一比一原版奥兹学院毕业证如何办理
一比一原版奥兹学院毕业证如何办理一比一原版奥兹学院毕业证如何办理
一比一原版奥兹学院毕业证如何办理
F
 
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
ydyuyu
 
Independent Escorts & Call Girls In Aerocity Delhi - 9758998899 - Escortgram ...
Independent Escorts & Call Girls In Aerocity Delhi - 9758998899 - Escortgram ...Independent Escorts & Call Girls In Aerocity Delhi - 9758998899 - Escortgram ...
Independent Escorts & Call Girls In Aerocity Delhi - 9758998899 - Escortgram ...
Escortgram India
 
一比一原版(Dundee毕业证书)英国爱丁堡龙比亚大学毕业证如何办理
一比一原版(Dundee毕业证书)英国爱丁堡龙比亚大学毕业证如何办理一比一原版(Dundee毕业证书)英国爱丁堡龙比亚大学毕业证如何办理
一比一原版(Dundee毕业证书)英国爱丁堡龙比亚大学毕业证如何办理
AS
 

Recently uploaded (20)

一比一原版犹他大学毕业证如何办理
一比一原版犹他大学毕业证如何办理一比一原版犹他大学毕业证如何办理
一比一原版犹他大学毕业证如何办理
 
20240510 QFM016 Irresponsible AI Reading List April 2024.pdf
20240510 QFM016 Irresponsible AI Reading List April 2024.pdf20240510 QFM016 Irresponsible AI Reading List April 2024.pdf
20240510 QFM016 Irresponsible AI Reading List April 2024.pdf
 
Ballia Escorts Service Girl ^ 9332606886, WhatsApp Anytime Ballia
Ballia Escorts Service Girl ^ 9332606886, WhatsApp Anytime BalliaBallia Escorts Service Girl ^ 9332606886, WhatsApp Anytime Ballia
Ballia Escorts Service Girl ^ 9332606886, WhatsApp Anytime Ballia
 
Washington Football Commanders Redskins Feathers Shirt
Washington Football Commanders Redskins Feathers ShirtWashington Football Commanders Redskins Feathers Shirt
Washington Football Commanders Redskins Feathers Shirt
 
Russian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
Russian Escort Abu Dhabi 0503464457 Abu DHabi EscortsRussian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
Russian Escort Abu Dhabi 0503464457 Abu DHabi Escorts
 
Indian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Indian Escort in Abu DHabi 0508644382 Abu Dhabi EscortsIndian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
Indian Escort in Abu DHabi 0508644382 Abu Dhabi Escorts
 
一比一原版(Offer)康考迪亚大学毕业证学位证靠谱定制
一比一原版(Offer)康考迪亚大学毕业证学位证靠谱定制一比一原版(Offer)康考迪亚大学毕业证学位证靠谱定制
一比一原版(Offer)康考迪亚大学毕业证学位证靠谱定制
 
💚 Call Girls Bahraich 9332606886 High Profile Call Girls You Can Get The S...
💚 Call Girls Bahraich   9332606886  High Profile Call Girls You Can Get The S...💚 Call Girls Bahraich   9332606886  High Profile Call Girls You Can Get The S...
💚 Call Girls Bahraich 9332606886 High Profile Call Girls You Can Get The S...
 
Tadepalligudem Escorts Service Girl ^ 9332606886, WhatsApp Anytime Tadepallig...
Tadepalligudem Escorts Service Girl ^ 9332606886, WhatsApp Anytime Tadepallig...Tadepalligudem Escorts Service Girl ^ 9332606886, WhatsApp Anytime Tadepallig...
Tadepalligudem Escorts Service Girl ^ 9332606886, WhatsApp Anytime Tadepallig...
 
pdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
pdfcoffee.com_business-ethics-q3m7-pdf-free.pdfpdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
pdfcoffee.com_business-ethics-q3m7-pdf-free.pdf
 
20240508 QFM014 Elixir Reading List April 2024.pdf
20240508 QFM014 Elixir Reading List April 2024.pdf20240508 QFM014 Elixir Reading List April 2024.pdf
20240508 QFM014 Elixir Reading List April 2024.pdf
 
Mira Road Housewife Call Girls 07506202331, Nalasopara Call Girls
Mira Road Housewife Call Girls 07506202331, Nalasopara Call GirlsMira Road Housewife Call Girls 07506202331, Nalasopara Call Girls
Mira Road Housewife Call Girls 07506202331, Nalasopara Call Girls
 
South Bopal [ (Call Girls) in Ahmedabad ₹7.5k Pick Up & Drop With Cash Paymen...
South Bopal [ (Call Girls) in Ahmedabad ₹7.5k Pick Up & Drop With Cash Paymen...South Bopal [ (Call Girls) in Ahmedabad ₹7.5k Pick Up & Drop With Cash Paymen...
South Bopal [ (Call Girls) in Ahmedabad ₹7.5k Pick Up & Drop With Cash Paymen...
 
Abu Dhabi Escorts Service 0508644382 Escorts in Abu Dhabi
Abu Dhabi Escorts Service 0508644382 Escorts in Abu DhabiAbu Dhabi Escorts Service 0508644382 Escorts in Abu Dhabi
Abu Dhabi Escorts Service 0508644382 Escorts in Abu Dhabi
 
Local Call Girls in Gomati 9332606886 HOT & SEXY Models beautiful and charmi...
Local Call Girls in Gomati  9332606886 HOT & SEXY Models beautiful and charmi...Local Call Girls in Gomati  9332606886 HOT & SEXY Models beautiful and charmi...
Local Call Girls in Gomati 9332606886 HOT & SEXY Models beautiful and charmi...
 
一比一原版奥兹学院毕业证如何办理
一比一原版奥兹学院毕业证如何办理一比一原版奥兹学院毕业证如何办理
一比一原版奥兹学院毕业证如何办理
 
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
哪里办理美国迈阿密大学毕业证(本硕)umiami在读证明存档可查
 
Independent Escorts & Call Girls In Aerocity Delhi - 9758998899 - Escortgram ...
Independent Escorts & Call Girls In Aerocity Delhi - 9758998899 - Escortgram ...Independent Escorts & Call Girls In Aerocity Delhi - 9758998899 - Escortgram ...
Independent Escorts & Call Girls In Aerocity Delhi - 9758998899 - Escortgram ...
 
Local Call Girls in Jharsuguda 9332606886 HOT & SEXY Models beautiful and ch...
Local Call Girls in Jharsuguda  9332606886 HOT & SEXY Models beautiful and ch...Local Call Girls in Jharsuguda  9332606886 HOT & SEXY Models beautiful and ch...
Local Call Girls in Jharsuguda 9332606886 HOT & SEXY Models beautiful and ch...
 
一比一原版(Dundee毕业证书)英国爱丁堡龙比亚大学毕业证如何办理
一比一原版(Dundee毕业证书)英国爱丁堡龙比亚大学毕业证如何办理一比一原版(Dundee毕业证书)英国爱丁堡龙比亚大学毕业证如何办理
一比一原版(Dundee毕业证书)英国爱丁堡龙比亚大学毕业证如何办理
 

Casl. isomorphic permission management.pptx

  • 2. Who am I and what I do here? Experience: ● working from dark times of IE6 ● PHP, Ruby, Nodejs, ~Java and .NET Core Hobbies: ● chess, books ● articles , open source contribution
  • 6. Why CASL? <div v-if="user.role === 'admin' || post.authorId === user.id"> <button @click="publish">Publish</button> </div>
  • 7. Why CASL? <div v-if="user.role === 'admin' || user.role === 'moderator' || post.authorId === user.id"> <button @click="publish">Publish</button> </div>
  • 9. Why CASL? <div v-if="can('publish')"> <button @click="publish">Publish</button> </div>
  • 10. Why CASL? <div v-if="can('publish', 'Post')"> <button @click="publish">Publish</button> </div>
  • 12. How to CASL Evolve ACL as requirements evolve1 What’s special in CASL? Declarative configuration2 In-memory validation and database queries3 MongoDB-like conditions4 Serializable rules5
  • 13. How to CASLHow to CASLHow to CASL
  • 14. How to CASLPermissions: admin can manage all
  • 15. How to CASLPermissions: writer can create Article can read Article where published = true can read, update Article where author = me can delete, publish Article where author = me and published = false can read, update User where id = me
  • 16. How to CASLPermissions: unauthenticated can read Article where published = true
  • 17. How to CASLCASL: admin can('manage', 'all')
  • 18. How to CASLCASL: admin import { AbilityBuilder } from '@casl/ability' const { can } = AbilityBuilder.extract() can('manage', 'all')
  • 19. How to CASLCASL: writer can('create', 'Article') can('read', 'Article', { published: true }) can(['read', 'update'], 'Article', { authorId: user.id }) can(['delete', 'publish'], 'Article', { authorId: user.id, published: false }) can(['read', 'update'], 'User', { id: user.id })
  • 20. How to CASLCASL: unauthenticated can('read', 'Article', { published: true })
  • 21. How to CASLCASL validation: seeds const myUser = new User({ id: 1, email: 'writer@casl.io' }) const myDraft = new Article({ authorId: myUser.id, published: false }) const myArticle = new Article({ authorId: myUser.id, published: true })
  • 22. How to CASLCASL validation: seeds const anotherUser = new User({ email: 'another.writer@casl.io' }) const anotherDraft = new Article({ ... }) const anotherArticle = new Article({ ... })
  • 23. How to CASLCASL validation: admin import { Ability } from '@casl/ability' import { rulesForAdmin } from './rules' const ability = new Ability(rulesForAdmin()) ability.can('read', 'Article') // true ability.can('read', 'User') // true ability.can('read', myArticle) // true
  • 24. How to CASLCASL validation: writer const ability = new Ability(rulesForWriter(myUser)) ability.can('create', 'Article') // true ability.can('read', anotherDraft) // false ability.can('read', anotherArticle) // true ability.can('read', myDraft) // true ability.can('read', myArticle) // true
  • 25. How to CASLCASL validation: unauthenticated const ability = new Ability(rulesForAnonymous()) ability.can('read', 'Article') // true ability.can('read', anotherArticle) // true ability.can('read', anotherUser) // false ability.can('read', anotherDraft) // false ability.can('create', 'Article') // false
  • 26.
  • 27. How to CASLCASL Demo Vue app Express API
  • 28. How to CASLCASL Alternatives
  • 29. Downloads / month Github stars Size (gzip) Last updated Tree shaking Instance validation Attribute validation DB Queries @casl/ability 105k 1.6k 3.9K 2 weeks ago Yes Yes Yes Yes acl 31k 2.3k 56.6K 2 years ago No No No No accesscontrol 44k 965 7.7K 10 months ago Maybe No Yes No connect-roles 20k 704 5.2K 9 months ago No No No No casbin 16k 670 34.6K 2 months ago Maybe Yes Yes No cancan 1.7k 578 985 1 year ago No Yes No No How to CASLCASL Alternatives
  • 30. THERE IS NO MAGIC HERE
  • 31. How to CASLNo Magic Behind! SQL joins1 Synchronous2 Specification pattern3
  • 32. How to CASLWhat else? NO ROLES IN MY ACL
  • 33. How to CASLWhat else? Feature flags
  • 34. How to CASLWhat else? Hardware capabilities
  • 35. How to CASLWhat else? Business logic async function rulesForUser(user) { const { rules, can, cannot } = AbilityBuilder.extract() can('read', 'Post') if (user.hasActiveSubscription()) { can('update', 'Post', { userId: user.id }) } else { cannot('update', 'Post') .because('Your subscription has been expired') } return rules })
  • 36. CASL Isomorphic Permission Management Sergii Stotskyi sergiy.stotskiy@gmail.com ?