在这部分文档中,并未清楚地解释所有防护用法的用例:
NestJS 文档 - 基于声明的授权
CaslAbilityFactory 为这些用例实现:
并仅解释了最琐碎的用例:
用户对所有内容拥有只读访问权限
它通过以下控制器方法进行了演示:
@Get()
@UseGuards(PoliciesGuard)
@checkPolicies((ability: AppAbility) => ability.can(Action.Read, Article))
findAll() {
return this.articlesService.findAll();
}
Run Code Online (Sandbox Code Playgroud)
但我应该如何注释一个方法来检查第三个或第四个用例:
已发布的文章无法删除:
(article.isPublished === true)
@Delete()
@UseGuards(PoliciesGuard)
@checkPolicies(?????????????????????????????)
delete(@Body() article: Article) {
return this.articlesService.delete(article.id);
}
Run Code Online (Sandbox Code Playgroud)
有可能吗?对于此要求,@checkPolicies 中声明的 PoliciesGuard 或处理程序应该能够访问方法参数。
如何从守卫访问控制器方法参数?
当然,如果您直接从控制器方法调用ability.can(...),则有一个解决方案:
@Delete()
@UseGuards(SomeGuards but NOT PoliciesGuard)
delete(@Body() article: Article) {
const ability = this.caslAbilityFactory.createForUser(<<user from request>>);
if (!ability.can(Action.Delete, article)) {
throw new UnauthorizedException();
}
return this.articlesService.delete(article.id);
}
Run Code Online (Sandbox Code Playgroud)
但这个解决方案不符合原来的声明模式。
我正在尝试在 NestJS 和 CASL 中为列表/获取端点实现基于通用策略的防护。我正在关注此处的文档https://docs.nestjs.com/security/authorization#integrating-casl。
一个用户可以属于多个组。我需要检查是否Article与任何用户组匹配的Books实体。并且仅当用户的组列表匹配且groupId允许用户读取它们Article.idBooks.id
但我无法得到它似乎正在工作
// User Object - from request.user after decoded from AuthGuard('jwt')
user = {
groups: ['department-1', 'department-2']
}
Run Code Online (Sandbox Code Playgroud)
// Article Entity
export class Article extends UUIDBase {
@Column({ nullable: false })
groupId: string
@Column({ nullable: true })
description: string
@Column({ nullable: true })
name: string
}
Run Code Online (Sandbox Code Playgroud)
// Books Entity
export class Books extends UUIDBase {
@Column({ nullable: false })
groupId: string
@Column({ nullable: true …Run Code Online (Sandbox Code Playgroud) 我正在使用一个非常基本的CASL实现。不幸的是,文档并没有那么详细。我有以下代码(基本上是从文档中复制粘贴的)。
import { abilitiesPlugin } from '@casl/vue'
import defineAbilitiesFor from './ability'
const ability = defineAbilitiesFor({name: 'guest'})
Vue.use(abilitiesPlugin, ability )
Run Code Online (Sandbox Code Playgroud)
其中defineAbilitiesFor定义为(在 ./ability.js 中)
import { AbilityBuilder } from '@casl/ability'
function defineAbilitiesFor(user) {
return AbilityBuilder.define((can, cannot) => {
can(['read'], 'foo', { username: user.name})
})
}
Run Code Online (Sandbox Code Playgroud)
我知道可以更新规则/条件(即ability.update([]))。但是初始化CASL后如何更新用户信息呢?(例如在用户登录后
我正在寻找一种在前端(React)和后端(Node.js、Koa、GraphQL)中实现授权的方法。我偶然发现了 casl 包: https: //github.com/stalniy/casl。
虽然后端授权对我来说似乎非常简单,但我不明白的是如何将我的授权规则从后端共享到前端。一篇中等帖子建议使用 JWT 代币。如何使用 JWT 令牌来做到这一点?
https://medium.com/dailyjs/casl-and-cancan-permissions-sharing- Between-ui-and-api-5f1fa8b4bec
我似乎无法使用条件规则访问嵌套对象。我希望如果文章的评论与用户具有相同的 id,则用户有权删除该文章。这些只是一些要测试的编造课程......
这是我的代码:
import { defineAbility, AbilityBuilder } from '@casl/ability';
import { Ability, AbilityClass, ExtractSubjectType, InferSubjects } from '@casl/ability';
export class Article {
static readonly modelName = "Article";
static readonly __typename = "Article";
constructor( id: number,
title: string,
content: string,
user: User,
comment: Comment) {
this.id = id
this.title = title
this.content = content
this.user = user
this.comment = comment
}
id: number
title: string
content: string
user: User
comment: Comment
}
export class User {
static readonly modelName = …Run Code Online (Sandbox Code Playgroud)