@lark-apaas/auth-sdk 0.1.0-alpha.9 → 0.1.0-beta.1

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 CHANGED
@@ -16,7 +16,7 @@ yarn add @lark-apaas/auth-sdk
16
16
 
17
17
  ```tsx
18
18
  import React from 'react';
19
- import { AuthProvider, Can, useAuthAbility } from '@lark-apaas/auth-sdk';
19
+ import { AuthProvider, CanRole, useAuthAbility } from '@lark-apaas/auth-sdk';
20
20
 
21
21
  export default function App() {
22
22
  return (
@@ -35,7 +35,8 @@ export default function App() {
35
35
  }
36
36
  ```
37
37
 
38
- ### 开发组件 - 使用 Can 组件
38
+
39
+ ### 开发组件 - 使用 CanRole 组件
39
40
 
40
41
  ```tsx
41
42
  import { CanRole } from '@lark-apaas/auth-sdk';
@@ -72,31 +73,7 @@ function Home() {
72
73
  }
73
74
  ```
74
75
 
75
- ### 开发组件 - 进阶示例
76
-
77
- ### 菜单按权限过滤
78
-
79
- ```tsx
80
- import { useContext } from 'react';
81
- import { AbilityContext } from '@lark-apaas/auth-sdk';
82
-
83
- const menus = [
84
- { name: 'Dashboard', path: '/dashboard', p: { action: 'role_admin', subject: '@role' } },
85
- { name: 'Users', path: '/users', p: { action: 'role_editor', subject: '@role' } },
86
- { name: 'Settings', path: '/settings', p: { action: 'role_admin', subject: '@role' } },
87
- ];
88
-
89
- function Nav() {
90
- const ability = useContext(AbilityContext);
91
- return (
92
- <nav>
93
- {menus.map(m => ability.can(m.p.action, m.p.subject) && (
94
- <a key={m.path} href={m.path}>{m.name}</a>
95
- ))}
96
- </nav>
97
- );
98
- }
99
- ```
76
+ ### 开发组件 - 见 Client Toolkit
100
77
 
101
78
  ---
102
79
 
@@ -33,10 +33,9 @@ export interface AuthProviderProps {
33
33
  *
34
34
  * function App() {
35
35
  * return (
36
- * <AuthProvider userId="user-123" config={{
36
+ * <AuthProvider config={{
37
37
  * permissionApi: {
38
- * baseUrl: 'http://localhost:3000',
39
- * endpoint: '/mock-api/users/:userId/permissions'
38
+ * url: '/app/app_xxx/__runtime__/api/v1/permissions/roles',
40
39
  * }
41
40
  * }}>
42
41
  * <YourApp />
@@ -1 +1 @@
1
- {"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../src/AuthProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAK7C;;GAEG;AACH,eAAO,MAAM,cAAc,uGAE1B,CAAC;AAEF;;;GAGG;AACH,UAAU,qBAAqB;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAOD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,iBAAiB,2CA2DnE;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,mBAAmB,EAAE,aAAa,CAAC,eAAe,CAAC,2GAiBpD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,OAAO,IAAI,qBAAqB,CAQ/C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,IAAI,YAAY,CAE7C;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,GAAG,sJAA+C,CAAC;AAEhE,eAAO,MAAM,UAAU,GAAa,WAAW;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,KAAG,OAepE,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,kDAIA"}
1
+ {"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../src/AuthProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAMN,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAK7C;;GAEG;AACH,eAAO,MAAM,cAAc,uGAE1B,CAAC;AAEF;;;GAGG;AACH,UAAU,qBAAqB;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,gBAAgB,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD;AAOD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,iBAAiB,2CA8DnE;AAED;;;;;GAKG;AACH,wBAAsB,UAAU,CAC9B,mBAAmB,EAAE,aAAa,CAAC,eAAe,CAAC,2GAmBpD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,OAAO,IAAI,qBAAqB,CAQ/C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,IAAI,YAAY,CAE7C;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,GAAG,sJAA+C,CAAC;AAEhE,eAAO,MAAM,UAAU,GAAa,WAAW;IAAE,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,KAAG,OASpE,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,KAAK,GACN,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,kDAIA"}
@@ -1,6 +1,6 @@
1
1
  import { Fragment, jsx } from "react/jsx-runtime";
2
2
  import { createContext, useCallback, useContext, useEffect, useState } from "react";
3
- import { ROLE_SUBJECT, createAbility, updateAbility } from "./ability-factory.js";
3
+ import { ROLE_SUBJECT, createAbility } from "./ability-factory.js";
4
4
  import { PermissionClient } from "./permission-client.js";
5
5
  import { createContextualCan } from "@casl/react";
6
6
  const AbilityContext = /*#__PURE__*/ createContext(createAbility({
@@ -9,18 +9,20 @@ const AbilityContext = /*#__PURE__*/ createContext(createAbility({
9
9
  }));
10
10
  const AuthStateContext = /*#__PURE__*/ createContext(null);
11
11
  function AuthProvider({ children, config }) {
12
- const [ability] = useState(()=>createAbility({}));
12
+ const [ability, setAbility] = useState(()=>createAbility({}));
13
13
  const [isLoading, setIsLoading] = useState(false);
14
14
  const [error, setError] = useState(null);
15
- const [client] = useState(()=>new PermissionClient(config?.permissionApi));
15
+ const [client] = useState(()=>config?.permissionApi ? new PermissionClient(config.permissionApi) : null);
16
16
  const fetchPermissions = useCallback(async ()=>{
17
+ if (!client) return;
17
18
  setIsLoading(true);
18
19
  setError(null);
19
20
  try {
20
21
  const data = await client.fetchPermissions();
21
- updateAbility(ability, {
22
+ const newAbility = createAbility({
22
23
  roles: data.roles
23
24
  });
25
+ setAbility(newAbility);
24
26
  config?.onSuccess?.(data);
25
27
  } catch (err) {
26
28
  const error = err instanceof Error ? err : new Error(String(err));
@@ -30,7 +32,6 @@ function AuthProvider({ children, config }) {
30
32
  setIsLoading(false);
31
33
  }
32
34
  }, [
33
- ability,
34
35
  client,
35
36
  config
36
37
  ]);
@@ -55,18 +56,18 @@ function AuthProvider({ children, config }) {
55
56
  });
56
57
  }
57
58
  async function getAbility(permissionApiConfig) {
58
- const ability = createAbility({});
59
+ if (!permissionApiConfig) return new Error('permissionApi config is required');
59
60
  const client = new PermissionClient(permissionApiConfig);
60
61
  try {
61
62
  const data = await client.fetchPermissions();
62
- updateAbility(ability, {
63
+ const ability = createAbility({
63
64
  roles: data.roles
64
65
  });
66
+ return ability;
65
67
  } catch (err) {
66
68
  const error = err instanceof Error ? err : new Error(String(err));
67
69
  return error;
68
70
  }
69
- return ability;
70
71
  }
71
72
  function useAuth() {
72
73
  const context = useContext(AuthStateContext);
@@ -78,9 +79,7 @@ function useAuthAbility() {
78
79
  }
79
80
  const Can = createContextualCan(AbilityContext.Consumer);
80
81
  const useCanRole = function({ roles }) {
81
- const context = useContext(AuthStateContext);
82
- if (!context) return false;
83
- const { ability } = context;
82
+ const ability = useContext(AbilityContext);
84
83
  const allowed = !roles || 0 === roles.length || roles.length > 0 && roles.some((role)=>ability.can(role, ROLE_SUBJECT));
85
84
  return !!allowed;
86
85
  };
@@ -4,7 +4,7 @@ import type { PermissionApiConfig, PermissionApiResponse } from './types';
4
4
  */
5
5
  export declare class PermissionClient {
6
6
  private config;
7
- constructor(config?: PermissionApiConfig);
7
+ constructor(config: PermissionApiConfig);
8
8
  /**
9
9
  * 获取用户权限数据
10
10
  */
@@ -1 +1 @@
1
- {"version":3,"file":"permission-client.d.ts","sourceRoot":"","sources":["../src/permission-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAU1E;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,CAAC,EAAE,mBAAmB;IAOxC;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAyDxD;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAOxD;;OAEG;IACH,SAAS,IAAI,mBAAmB;CAGjC"}
1
+ {"version":3,"file":"permission-client.d.ts","sourceRoot":"","sources":["../src/permission-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAE1E;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAIvC;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAkDxD;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,IAAI;IAOxD;;OAEG;IACH,SAAS,IAAI,mBAAmB;CAGjC"}
@@ -1,22 +1,13 @@
1
- const DEFAULT_CONFIG = {
2
- baseUrl: '',
3
- timeout: 5000
4
- };
5
1
  class PermissionClient {
6
2
  constructor(config){
7
- this.config = {
8
- ...DEFAULT_CONFIG,
9
- ...config
10
- };
3
+ this.config = config;
11
4
  }
12
5
  async fetchPermissions() {
13
- const { timeout = DEFAULT_CONFIG.timeout, headers = {} } = this.config;
14
- const { appId } = window;
15
- if (!appId) throw new Error('appId is required');
16
- const url = `/spark/app/${appId}/runtime/api/v1/permissions/roles`;
6
+ const { url, timeout = 5000, headers = {} } = this.config;
17
7
  const requestHeaders = {
8
+ ...headers,
18
9
  'Content-Type': 'application/json',
19
- ...headers
10
+ 'X-Suda-Csrf-Token': window.csrfToken || ''
20
11
  };
21
12
  const controller = new AbortController();
22
13
  const timeoutId = setTimeout(()=>controller.abort(), timeout);
package/lib/types.d.ts CHANGED
@@ -1,3 +1,10 @@
1
+ declare global {
2
+ interface Window {
3
+ appId?: string;
4
+ csrfToken?: string;
5
+ userID?: string;
6
+ }
7
+ }
1
8
  /**
2
9
  * 权限操作类型
3
10
  */
@@ -35,10 +42,9 @@ export interface PermissionApiResponse {
35
42
  */
36
43
  export interface PermissionApiConfig {
37
44
  /**
38
- * API 基础 URL
39
- * @default ''
45
+ * 权限接口完整 URL,由上层注入,不在 SDK 内部硬编码
40
46
  */
41
- baseUrl?: string;
47
+ url: string;
42
48
  /**
43
49
  * 请求超时时间(毫秒)
44
50
  * @default 5000
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,MAAM,GACd,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,MAAM,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAEpC;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEjC;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB;CACF;AAED;;GAEG;AACH,MAAM,MAAM,MAAM,GACd,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,MAAM,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAEpC;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEjC;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,OAAO,EAAE,OAAO,GAAG,OAAO,EAAE,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lark-apaas/auth-sdk",
3
- "version": "0.1.0-alpha.9",
3
+ "version": "0.1.0-beta.1",
4
4
  "description": "基于 CASL 的前端鉴权 SDK",
5
5
  "types": "./lib/index.d.ts",
6
6
  "main": "./lib/index.js",
@@ -15,11 +15,12 @@
15
15
  "scripts": {
16
16
  "build": "rslib build",
17
17
  "dev": "rslib build --watch",
18
- "type-check": "tsc --noEmit"
18
+ "type-check": "tsc --noEmit",
19
+ "prepublishOnly": "npm run build"
19
20
  },
20
21
  "dependencies": {
21
- "@casl/ability": "^6.7.1",
22
- "@casl/react": "^4.0.0"
22
+ "@casl/ability": "^6.7.5",
23
+ "@casl/react": "^5.0.0"
23
24
  },
24
25
  "devDependencies": {
25
26
  "@rsbuild/core": "~1.4.13",