标签: casl

在 NestJS 防护中使用 CASL

在这部分文档中,并未清楚地解释所有防护用法的用例:
NestJS 文档 - 基于声明的授权

CaslAbilityFactory 为这些用例实现:

  • 管理员可以管理(创建/读取/更新/删除)所有实体
  • 用户对所有内容拥有只读访问权限
  • 用户可以更新他们的文章(article.authorId === userId)
  • 无法删除已发布的文章 (article.isPublished === true)

并仅解释了最琐碎的用例:

用户对所有内容拥有只读访问权限

它通过以下控制器方法进行了演示:

@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)

但这个解决方案不符合原来的声明模式。

authorization nestjs casl

9
推荐指数
1
解决办法
1984
查看次数

NestJs CASL 基于用户属性和策略的授权守护

我正在尝试在 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)

javascript authorization typescript nestjs casl

5
推荐指数
1
解决办法
6831
查看次数

在 CASL 中更新用户

我正在使用一个非常基本的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后如何更新用户信息呢?(例如在用户登录后

javascript vue.js casl

4
推荐指数
1
解决办法
2672
查看次数

通过后端和前端之间共享 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

javascript node.js reactjs casl

4
推荐指数
1
解决办法
2422
查看次数

我如何访问 CASL 条件的嵌套属性

我似乎无法使用条件规则访问嵌套对象。我希望如果文章的评论与用户具有相同的 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)

node.js typescript casl

2
推荐指数
1
解决办法
2368
查看次数