@lark-apaas/nestjs-authzpaas 0.1.0-alpha.0 → 0.1.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -253
- package/dist/index.cjs +231 -1011
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +51 -381
- package/dist/index.d.ts +51 -381
- package/dist/index.js +220 -991
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -230,257 +230,6 @@ export class SensitiveController {
|
|
|
230
230
|
}
|
|
231
231
|
```
|
|
232
232
|
|
|
233
|
-
### 2. CanPermission - 权限检查
|
|
234
|
-
|
|
235
|
-
使用 `@CanPermission()` 装饰器检查用户对特定资源的操作权限。
|
|
236
|
-
|
|
237
|
-
#### 示例 1: 单个操作检查
|
|
238
|
-
|
|
239
|
-
```typescript
|
|
240
|
-
import { Controller, Get } from '@nestjs/common';
|
|
241
|
-
import { CanPermission } from '@lark-apaas/nestjs-authzpaas';
|
|
242
|
-
|
|
243
|
-
@Controller('demo')
|
|
244
|
-
export class DemoController {
|
|
245
|
-
// 需要对 User 资源有 read 权限
|
|
246
|
-
@CanPermission([{ actions: ['read'], subject: 'User' }])
|
|
247
|
-
@Get('read-user')
|
|
248
|
-
readUser() {
|
|
249
|
-
return {
|
|
250
|
-
message: '✅ 用户读取成功(需要 read 权限)',
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
// 需要对 User 资源有 create 权限
|
|
255
|
-
@CanPermission([{ actions: ['create'], subject: 'User' }])
|
|
256
|
-
@Get('create-user')
|
|
257
|
-
createUser() {
|
|
258
|
-
return {
|
|
259
|
-
message: '✅ 用户创建成功(需要 create 权限)',
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
#### 示例 2: 多个操作检查(AND 逻辑,默认)
|
|
266
|
-
|
|
267
|
-
```typescript
|
|
268
|
-
@Controller('articles')
|
|
269
|
-
export class ArticleController {
|
|
270
|
-
// 需要同时拥有 read 和 update 权限
|
|
271
|
-
@CanPermission([{
|
|
272
|
-
actions: ['read', 'update'],
|
|
273
|
-
subject: 'Article',
|
|
274
|
-
requireAll: true // 默认为 true,可省略
|
|
275
|
-
}])
|
|
276
|
-
@Get('publish')
|
|
277
|
-
publish() {
|
|
278
|
-
return '发布文章';
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
#### 示例 3: 多个操作检查(OR 逻辑)
|
|
284
|
-
|
|
285
|
-
```typescript
|
|
286
|
-
@Controller('articles')
|
|
287
|
-
export class ArticleController {
|
|
288
|
-
// 拥有 read 或 preview 任一权限即可
|
|
289
|
-
@CanPermission([{
|
|
290
|
-
actions: ['read', 'preview'],
|
|
291
|
-
subject: 'Article',
|
|
292
|
-
requireAll: false // OR 逻辑
|
|
293
|
-
}])
|
|
294
|
-
@Get('preview')
|
|
295
|
-
preview() {
|
|
296
|
-
return '预览文章';
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
```
|
|
300
|
-
|
|
301
|
-
#### 示例 4: 多个资源权限检查
|
|
302
|
-
|
|
303
|
-
```typescript
|
|
304
|
-
@Controller('articles')
|
|
305
|
-
export class ArticleController {
|
|
306
|
-
// 需要同时满足:能读文章 AND 能创建评论
|
|
307
|
-
@CanPermission([
|
|
308
|
-
{ actions: ['read'], subject: 'Article' },
|
|
309
|
-
{ actions: ['create'], subject: 'Comment' }
|
|
310
|
-
])
|
|
311
|
-
@Get('comment')
|
|
312
|
-
addComment() {
|
|
313
|
-
return '添加评论';
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
// 需要同时满足:能读文章 AND (能更新或删除评论)
|
|
317
|
-
@CanPermission([
|
|
318
|
-
{ actions: ['read'], subject: 'Article' },
|
|
319
|
-
{ actions: ['update', 'delete'], subject: 'Comment', requireAll: false }
|
|
320
|
-
])
|
|
321
|
-
@Get('manage-comment')
|
|
322
|
-
manageComment() {
|
|
323
|
-
return '管理评论';
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
### 3. UserId - 获取用户ID
|
|
329
|
-
|
|
330
|
-
使用 `@UserId()` 参数装饰器获取当前用户ID。
|
|
331
|
-
|
|
332
|
-
#### 示例 1: 基本用法
|
|
333
|
-
|
|
334
|
-
```typescript
|
|
335
|
-
import { Controller, Get } from '@nestjs/common';
|
|
336
|
-
import { UserId } from '@lark-apaas/nestjs-authzpaas';
|
|
337
|
-
|
|
338
|
-
@Controller('demo')
|
|
339
|
-
export class DemoController {
|
|
340
|
-
@Get('profile')
|
|
341
|
-
getProfile(@UserId() userId: string) {
|
|
342
|
-
return {
|
|
343
|
-
message: '获取用户资料',
|
|
344
|
-
userId,
|
|
345
|
-
};
|
|
346
|
-
}
|
|
347
|
-
}
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
#### 示例 2: 结合 PermissionService 使用
|
|
351
|
-
|
|
352
|
-
```typescript
|
|
353
|
-
import { Controller, Get } from '@nestjs/common';
|
|
354
|
-
import { UserId, PermissionService } from '@lark-apaas/nestjs-authzpaas';
|
|
355
|
-
|
|
356
|
-
@Controller('demo')
|
|
357
|
-
export class DemoController {
|
|
358
|
-
constructor(private readonly permissionService: PermissionService) {}
|
|
359
|
-
|
|
360
|
-
@Get('check-permission')
|
|
361
|
-
async checkPermission(@UserId() userId: string) {
|
|
362
|
-
// 手动检查权限
|
|
363
|
-
const hasPermission = await this.permissionService.checkPermissions(
|
|
364
|
-
[{ actions: ['read'], subject: 'User' }],
|
|
365
|
-
userId
|
|
366
|
-
);
|
|
367
|
-
|
|
368
|
-
return {
|
|
369
|
-
message: '权限检查成功',
|
|
370
|
-
userId,
|
|
371
|
-
hasPermission,
|
|
372
|
-
};
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
```
|
|
376
|
-
|
|
377
|
-
#### 示例 3: 使用 CASL Ability
|
|
378
|
-
|
|
379
|
-
```typescript
|
|
380
|
-
import { Controller, Get } from '@nestjs/common';
|
|
381
|
-
import { UserId, PermissionService, ROLE_SUBJECT } from '@lark-apaas/nestjs-authzpaas';
|
|
382
|
-
|
|
383
|
-
@Controller('demo')
|
|
384
|
-
export class DemoController {
|
|
385
|
-
constructor(private readonly permissionService: PermissionService) {}
|
|
386
|
-
|
|
387
|
-
@Get('ability')
|
|
388
|
-
async getAbility(@UserId() userId: string) {
|
|
389
|
-
const ability = await this.permissionService.getAbility(userId);
|
|
390
|
-
|
|
391
|
-
// 使用 CASL Ability 检查权限
|
|
392
|
-
const canReadUser = ability.can('read', 'User');
|
|
393
|
-
const canWriteTask = ability.can('write', 'Task');
|
|
394
|
-
const isAdmin = ability.can('admin', ROLE_SUBJECT);
|
|
395
|
-
|
|
396
|
-
return {
|
|
397
|
-
userId,
|
|
398
|
-
permissions: {
|
|
399
|
-
canReadUser,
|
|
400
|
-
canWriteTask,
|
|
401
|
-
isAdmin,
|
|
402
|
-
},
|
|
403
|
-
};
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
```
|
|
407
|
-
|
|
408
|
-
### 4. MockRoles - 角色模拟
|
|
409
|
-
|
|
410
|
-
使用 `@MockRoles()` 参数装饰器获取模拟角色,仅在 `enableMockRole: true` 时有效。
|
|
411
|
-
|
|
412
|
-
#### 示例 1: 基本用法
|
|
413
|
-
|
|
414
|
-
```typescript
|
|
415
|
-
import { Controller, Get } from '@nestjs/common';
|
|
416
|
-
import { MockRoles } from '@lark-apaas/nestjs-authzpaas';
|
|
417
|
-
|
|
418
|
-
@Controller('demo')
|
|
419
|
-
export class DemoController {
|
|
420
|
-
@Get('mock-roles')
|
|
421
|
-
getMockRoles(@MockRoles() mockRoles: string[]) {
|
|
422
|
-
return {
|
|
423
|
-
message: '获取模拟角色',
|
|
424
|
-
mockRoles: mockRoles || [],
|
|
425
|
-
hasMockRoles: !!mockRoles,
|
|
426
|
-
};
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
```
|
|
430
|
-
|
|
431
|
-
#### 示例 2: 结合权限检查
|
|
432
|
-
|
|
433
|
-
```typescript
|
|
434
|
-
@Controller('admin')
|
|
435
|
-
export class AdminController {
|
|
436
|
-
@Get('test')
|
|
437
|
-
@CanRole(['admin']) // 会优先使用模拟角色进行验证
|
|
438
|
-
testWithMockRoles(@MockRoles() mockRoles: string[]) {
|
|
439
|
-
return {
|
|
440
|
-
message: '管理员测试接口',
|
|
441
|
-
mockRoles,
|
|
442
|
-
};
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
```
|
|
446
|
-
|
|
447
|
-
### 5. 装饰器组合使用
|
|
448
|
-
|
|
449
|
-
可以组合使用多个装饰器实现复杂的鉴权需求。
|
|
450
|
-
|
|
451
|
-
#### 示例 1: 角色 + 权限
|
|
452
|
-
|
|
453
|
-
```typescript
|
|
454
|
-
import { Controller, Get } from '@nestjs/common';
|
|
455
|
-
import { CanRole, CanPermission } from '@lark-apaas/nestjs-authzpaas';
|
|
456
|
-
|
|
457
|
-
@Controller('posts')
|
|
458
|
-
export class PostController {
|
|
459
|
-
// 需要 editor 角色 + 对 Post 有 delete 权限
|
|
460
|
-
@CanRole(['editor'])
|
|
461
|
-
@CanPermission([{ actions: ['delete'], subject: 'Post' }])
|
|
462
|
-
@Get('delete')
|
|
463
|
-
delete() {
|
|
464
|
-
return '删除帖子';
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
```
|
|
468
|
-
|
|
469
|
-
#### 示例 2: 多层权限检查
|
|
470
|
-
|
|
471
|
-
```typescript
|
|
472
|
-
@Controller('tasks')
|
|
473
|
-
export class TasksController {
|
|
474
|
-
// 需要 admin 或 manager 角色 + Task 的 manage 权限
|
|
475
|
-
@CanRole(['admin', 'manager'])
|
|
476
|
-
@CanPermission([{ actions: ['manage'], subject: 'Task' }])
|
|
477
|
-
@Get('manage')
|
|
478
|
-
manageTasks() {
|
|
479
|
-
return '管理任务';
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
```
|
|
483
|
-
|
|
484
233
|
## 核心组件
|
|
485
234
|
|
|
486
235
|
> 📚 **核心组件是装饰器的底层实现**,了解核心组件有助于深入理解权限系统的工作原理。
|
|
@@ -491,8 +240,6 @@ export class TasksController {
|
|
|
491
240
|
|
|
492
241
|
1. **提取用户ID**: 从 `req.userContext.userId` 中提取用户ID
|
|
493
242
|
2. **角色检查**: 如果使用了 `@CanRole()`,检查用户角色
|
|
494
|
-
3. **权限检查**: 如果使用了 `@CanPermission()`,检查用户权限
|
|
495
|
-
4. **环境检查**: 如果使用了 `@RequireEnvironment()`,检查环境条件
|
|
496
243
|
5. **注入权限数据**: 将权限数据附加到 `req.userPermissions`
|
|
497
244
|
|
|
498
245
|
**工作流程**:
|