在 AppAbilityFactory 里面,添加一个构造方法,然后注入一个 ConfigService 。下面再定义一个方法,它的作用就是为指定的用户创建能力,这里说的能力指的就是用户可以对指定资源做的事情。方法的名字是 createAbilityForUser,接收一个 user 参数,类型是 UserEntity。
在方法里面,需要一些构建用户能力用的方法,解构一下 can,build ,新建一个 AbilityBuilder ,提供一个 Ability,这个 Ability 可以作为一个 AbilityClass,参数是上面定义的 AppAbility。这个 AbilityBuilder 提供的东西是 AppAbility。
管理员
下面我们先描述一下管理员的能力,先声明一个 rootUserId,它的值可以用一下 this.configService.get,得到 accessControl 里的 rootUserId 这个配置,它的值是管理员用户的 id。
在我们的应用里,管理员可以做任何事情,下面可以判断一下,如果 user.id 等于 rootUserId,可以用一下 can,动作是 Action.manage,主题是 'all'。意思就是,如果用户是管理员,他就可以对所有主题做任何事情。
内容
然后再去描述一下用户对内容的能力,首先用户可以阅读内容,但是内容的 status 字段的值必须是 published。描述这条权限可以这样,用一下 can,动作是 Action.read ,主题是 PostEntity,条件是 status 字段的值应该等于 PostStatus.published。
用户如果是内容的作者,他就可以管理这个内容,用一个 can,动作是 Action.manage ,表示管理,指的就是任何动作,主题是 PostEntity,条件是内容数据里的 userId 这个字段的值应该等于用户的 id,也就是 user 里的 id。
构建
方法返回的东西就是给用户构建的能力,用一下 build ,这里我们需要再配置一下,提供一个对象参数,设置一下 detectSubjectType,它的值是一个函数,有个 subject 参数,返回的值是 subject.constructor ,as ExtractSubjectType,参数是 Subjects。
这个配置的意思就是告诉 CSAL 如何判断主题的类型。因为只有知道被验证的主题的类型,才能判断用户对这个主题能执行的动作。