@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 +4 -27
- package/lib/AuthProvider.d.ts +2 -3
- package/lib/AuthProvider.d.ts.map +1 -1
- package/lib/AuthProvider.js +10 -11
- package/lib/permission-client.d.ts +1 -1
- package/lib/permission-client.d.ts.map +1 -1
- package/lib/permission-client.js +4 -13
- package/lib/types.d.ts +9 -3
- package/lib/types.d.ts.map +1 -1
- package/package.json +5 -4
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,
|
|
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
|
-
|
|
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
|
|
package/lib/AuthProvider.d.ts
CHANGED
|
@@ -33,10 +33,9 @@ export interface AuthProviderProps {
|
|
|
33
33
|
*
|
|
34
34
|
* function App() {
|
|
35
35
|
* return (
|
|
36
|
-
* <AuthProvider
|
|
36
|
+
* <AuthProvider config={{
|
|
37
37
|
* permissionApi: {
|
|
38
|
-
*
|
|
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
|
|
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"}
|
package/lib/AuthProvider.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
};
|
|
@@ -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;
|
|
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"}
|
package/lib/permission-client.js
CHANGED
|
@@ -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 =
|
|
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
|
-
|
|
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
|
-
*
|
|
39
|
-
* @default ''
|
|
45
|
+
* 权限接口完整 URL,由上层注入,不在 SDK 内部硬编码
|
|
40
46
|
*/
|
|
41
|
-
|
|
47
|
+
url: string;
|
|
42
48
|
/**
|
|
43
49
|
* 请求超时时间(毫秒)
|
|
44
50
|
* @default 5000
|
package/lib/types.d.ts.map
CHANGED
|
@@ -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
|
|
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-
|
|
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.
|
|
22
|
-
"@casl/react": "^
|
|
22
|
+
"@casl/ability": "^6.7.5",
|
|
23
|
+
"@casl/react": "^5.0.0"
|
|
23
24
|
},
|
|
24
25
|
"devDependencies": {
|
|
25
26
|
"@rsbuild/core": "~1.4.13",
|