D-Y-Innovations / casl-sample

0 stars 0 forks source link

casl web service #1

Open strokes28 opened 6 years ago

strokes28 commented 6 years ago

定义rules时,如果相邻的两条rule有交集时,对此交集部分以后一条rule为准

import { AbilityBuilder, Ability } from '@casl/ability'

const ability = AbilityBuilder.define((can: any, cannot: any) => {
    can('manage', 'all')
    cannot('delete', 'all')
    can('delete', 'Post')
})

ability.can('delete', 'all')  //false
ability.can('delete', 'Post')  //true
strokes28 commented 6 years ago

定义rules时,如果传入的subject为类的实例对象,则subject为该实例的类名

// player.ts

export class Player {

    play() {
        console.log('play')
    }

    stop() {
        console.log('stop')
    }
}

export class MusicPlayer extends Player {

    play() {
        console.log('music play')
    }

    stop() {
        console.log('music stop')
    }
}

export class MoviePlayer extends Player {

    play() {
        console.log('movie play')
    }

    stop() {
        console.log('movie stop')
    }
}
import { AbilityBuilder, Ability } from '@casl/ability'
import * as model from './player'

const player = new model.Player()
const musicPlayer = new model.MusicPlayer()
const moviePlayer = new model.MoviePlayer()

const ability = AbilityBuilder.define((can: any, cannot: any) => {

    can('play', player)         //{ actions: 'play', subject: [ 'Player' ] }

    can('music', musicPlayer)   //{ actions: 'music', subject: [ 'MusicPlayer' ] }

    can('movie', moviePlayer)   //{ actions: 'movie', subject: [ 'MoviePlayer' ] }
})

class Player {
}
ability.can('play', new Player())  //true

ability.can('play', musicPlayer)   //false

ability.can('music', player)       //false

ability.can('movie', moviePlayer)  //true