Open strokes28 opened 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
定义rules时,如果相邻的两条rule有交集时,对此交集部分以后一条rule为准