@lark-apaas/auth-sdk 0.1.0-alpha.65 → 0.1.0-alpha.67
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 +1 -1
- package/lib/AuthProvider.d.ts +63 -19
- package/lib/AuthProvider.d.ts.map +1 -1
- package/lib/AuthProvider.js +41 -27
- package/lib/index.d.ts +2 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +2 -2
- package/lib/permission-client.d.ts +4 -0
- package/lib/permission-client.d.ts.map +1 -1
- package/lib/permission-client.js +26 -0
- package/lib/types.d.ts +7 -0
- package/lib/types.d.ts.map +1 -1
- package/package.json +1 -1
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, CanRole,
|
|
19
|
+
import { AuthProvider, CanRole, useAuthAbility } from '@lark-apaas/auth-sdk';
|
|
20
20
|
|
|
21
21
|
export default function App() {
|
|
22
22
|
return (
|
package/lib/AuthProvider.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export declare const AbilityContext: React.Context<MongoAbility<import("@casl/ab
|
|
|
11
11
|
*/
|
|
12
12
|
interface AuthStateContextValue {
|
|
13
13
|
ability: MongoAbility;
|
|
14
|
+
permissions: string[];
|
|
14
15
|
isLoading: boolean;
|
|
15
16
|
error: Error | null;
|
|
16
17
|
fetchPermissions: (userId?: string) => Promise<void>;
|
|
@@ -57,10 +58,11 @@ export declare function getAbility(permissionApiConfig: AuthSdkConfig['permissio
|
|
|
57
58
|
*
|
|
58
59
|
* @example
|
|
59
60
|
* ```tsx
|
|
60
|
-
* import { useAuth } from '@lark-apaas/auth-sdk';
|
|
61
|
+
* import { useAuth, useAbility } from '@lark-apaas/auth-sdk';
|
|
61
62
|
*
|
|
62
63
|
* function MyComponent() {
|
|
63
|
-
* const {
|
|
64
|
+
* const { permissions, isLoading } = useAuth();
|
|
65
|
+
* const ability = useAbility();
|
|
64
66
|
*
|
|
65
67
|
* if (isLoading) return <div>Loading...</div>;
|
|
66
68
|
*
|
|
@@ -74,36 +76,46 @@ export declare function getAbility(permissionApiConfig: AuthSdkConfig['permissio
|
|
|
74
76
|
*/
|
|
75
77
|
export declare function useAuth(): AuthStateContextValue;
|
|
76
78
|
/**
|
|
77
|
-
*
|
|
79
|
+
* useAuthAbility Hook - 获取 Ability 实例
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```tsx
|
|
83
|
+
* import { useAuthAbility } from '@lark-apaas/auth-sdk';
|
|
84
|
+
*
|
|
85
|
+
* function MyComponent() {
|
|
86
|
+
* const ability = useAuthAbility();
|
|
87
|
+
*
|
|
88
|
+
* return (
|
|
89
|
+
* <button disabled={ability.cannot('create', 'Task')}>
|
|
90
|
+
* Create Task
|
|
91
|
+
* </button>
|
|
92
|
+
* );
|
|
93
|
+
* }
|
|
94
|
+
* ```
|
|
78
95
|
*/
|
|
79
|
-
declare
|
|
96
|
+
export declare function useAuthAbility(): MongoAbility;
|
|
80
97
|
/**
|
|
81
98
|
* Can Component - 基于 Ability 实例的条件渲染组件
|
|
82
99
|
*
|
|
83
|
-
* 内置 isLoading 保护:权限加载期间渲染 fallback(默认为 null),
|
|
84
|
-
* 避免因 ability 未就绪而误判为无权限导致内容闪烁。
|
|
85
|
-
*
|
|
86
100
|
* @example
|
|
87
101
|
* ```tsx
|
|
88
102
|
* import { Can } from '@lark-apaas/auth-sdk';
|
|
89
103
|
*
|
|
90
104
|
* function MyComponent() {
|
|
91
105
|
* return (
|
|
92
|
-
* <Can I="Admin" a="@role"
|
|
106
|
+
* <Can I="Admin" a="@role">
|
|
93
107
|
* <TaskList />
|
|
94
108
|
* </Can>
|
|
95
109
|
* );
|
|
96
110
|
* }
|
|
97
111
|
* ```
|
|
98
112
|
*/
|
|
99
|
-
export declare
|
|
100
|
-
|
|
101
|
-
|
|
113
|
+
export declare const Can: React.FunctionComponent<import("@casl/react").BoundCanProps<MongoAbility<import("@casl/ability").AbilityTuple, import("@casl/ability").MongoQuery>>>;
|
|
114
|
+
export declare const useCanRole: ({ roles }: {
|
|
115
|
+
roles: string[];
|
|
116
|
+
}) => boolean;
|
|
102
117
|
/**
|
|
103
|
-
* CanRole Component -
|
|
104
|
-
*
|
|
105
|
-
* 支持 fallback prop,用于在权限加载期间显示自定义内容(如 Loading),
|
|
106
|
-
* 避免加载期间因 can() 返回 false 而误判为无权限。
|
|
118
|
+
* CanRole Component - 基于 Ability 实例的角色条件渲染组件
|
|
107
119
|
*
|
|
108
120
|
* @example
|
|
109
121
|
* ```tsx
|
|
@@ -111,17 +123,49 @@ export declare function Can({ fallback, ...props }: React.ComponentProps<typeof
|
|
|
111
123
|
*
|
|
112
124
|
* function MyComponent() {
|
|
113
125
|
* return (
|
|
114
|
-
* <CanRole roles={['
|
|
115
|
-
* <
|
|
126
|
+
* <CanRole roles={['role_admin', 'role_editor']}>
|
|
127
|
+
* <TaskList />
|
|
116
128
|
* </CanRole>
|
|
117
129
|
* );
|
|
118
130
|
* }
|
|
119
131
|
* ```
|
|
120
132
|
*/
|
|
121
|
-
export declare function CanRole({ children, roles,
|
|
133
|
+
export declare function CanRole({ children, roles, }: {
|
|
122
134
|
children: React.ReactNode;
|
|
123
135
|
roles: string[];
|
|
124
|
-
fallback?: React.ReactNode;
|
|
125
136
|
}): import("react/jsx-runtime").JSX.Element | null;
|
|
137
|
+
/**
|
|
138
|
+
* useUserPermissions Hook - 获取当前用户的权限点位列表
|
|
139
|
+
*/
|
|
140
|
+
export declare function useUserPermissions(): string[];
|
|
141
|
+
/**
|
|
142
|
+
* useCanPermission Hook - 判断用户是否拥有指定权限点位
|
|
143
|
+
*
|
|
144
|
+
* @param permissions - 需要检查的权限点位列表
|
|
145
|
+
* @param match - 匹配模式:'any' 任一匹配即可,'all' 需要全部匹配
|
|
146
|
+
*/
|
|
147
|
+
export declare function useCanPermission(permissions: string[], match?: 'any' | 'all'): boolean;
|
|
148
|
+
/**
|
|
149
|
+
* CanPermission Component - 基于权限点位的条件渲染组件
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```tsx
|
|
153
|
+
* import { CanPermission } from '@lark-apaas/auth-sdk';
|
|
154
|
+
*
|
|
155
|
+
* function MyComponent() {
|
|
156
|
+
* return (
|
|
157
|
+
* <CanPermission permissions={['task:create', 'task:edit']} match="any">
|
|
158
|
+
* <TaskEditor />
|
|
159
|
+
* </CanPermission>
|
|
160
|
+
* );
|
|
161
|
+
* }
|
|
162
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
export declare function CanPermission({ children, permissions, match, fallback, }: {
|
|
165
|
+
children: React.ReactNode;
|
|
166
|
+
permissions: string[];
|
|
167
|
+
match?: 'any' | 'all';
|
|
168
|
+
fallback?: React.ReactNode;
|
|
169
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
126
170
|
export {};
|
|
127
171
|
//# sourceMappingURL=AuthProvider.d.ts.map
|
|
@@ -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;
|
|
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;AAOF;;;GAGG;AACH,UAAU,qBAAqB;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,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,2CA4EnE;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;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,GAAE,KAAK,GAAG,KAAa,GAC3B,OAAO,CAOT;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,WAAW,EACX,KAAa,EACb,QAAe,GAChB,EAAE;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;IACtB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,2CAGA"}
|
package/lib/AuthProvider.js
CHANGED
|
@@ -7,12 +7,14 @@ const AbilityContext = /*#__PURE__*/ createContext(createAbility({
|
|
|
7
7
|
permissions: [],
|
|
8
8
|
roles: []
|
|
9
9
|
}));
|
|
10
|
+
const PermissionsContext = /*#__PURE__*/ createContext([]);
|
|
10
11
|
const AuthStateContext = /*#__PURE__*/ createContext(null);
|
|
11
12
|
function AuthProvider({ children, config }) {
|
|
12
13
|
const [ability, setAbility] = useState(()=>createAbility({}));
|
|
13
|
-
const [
|
|
14
|
-
const [isLoading, setIsLoading] = useState(
|
|
14
|
+
const [permissions, setPermissions] = useState([]);
|
|
15
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
15
16
|
const [error, setError] = useState(null);
|
|
17
|
+
const [client] = useState(()=>config?.permissionApi ? new PermissionClient(config.permissionApi) : null);
|
|
16
18
|
const fetchPermissions = useCallback(async ()=>{
|
|
17
19
|
if (!client) return;
|
|
18
20
|
setIsLoading(true);
|
|
@@ -23,6 +25,10 @@ function AuthProvider({ children, config }) {
|
|
|
23
25
|
roles: data.roles
|
|
24
26
|
});
|
|
25
27
|
setAbility(newAbility);
|
|
28
|
+
if (config?.permissionsApi) try {
|
|
29
|
+
const userPermissions = await client.fetchUserPermissions(config.permissionsApi);
|
|
30
|
+
setPermissions(userPermissions);
|
|
31
|
+
} catch {}
|
|
26
32
|
config?.onSuccess?.(data);
|
|
27
33
|
} catch (err) {
|
|
28
34
|
const error = err instanceof Error ? err : new Error(String(err));
|
|
@@ -43,15 +49,19 @@ function AuthProvider({ children, config }) {
|
|
|
43
49
|
]);
|
|
44
50
|
const stateContextValue = {
|
|
45
51
|
ability,
|
|
52
|
+
permissions,
|
|
46
53
|
isLoading,
|
|
47
54
|
error,
|
|
48
55
|
fetchPermissions
|
|
49
56
|
};
|
|
50
57
|
return /*#__PURE__*/ jsx(AbilityContext.Provider, {
|
|
51
58
|
value: ability,
|
|
52
|
-
children: /*#__PURE__*/ jsx(
|
|
53
|
-
value:
|
|
54
|
-
children:
|
|
59
|
+
children: /*#__PURE__*/ jsx(PermissionsContext.Provider, {
|
|
60
|
+
value: permissions,
|
|
61
|
+
children: /*#__PURE__*/ jsx(AuthStateContext.Provider, {
|
|
62
|
+
value: stateContextValue,
|
|
63
|
+
children: children
|
|
64
|
+
})
|
|
55
65
|
})
|
|
56
66
|
});
|
|
57
67
|
}
|
|
@@ -74,34 +84,38 @@ function useAuth() {
|
|
|
74
84
|
if (!context) throw new Error('useAuth must be used within an AuthProvider');
|
|
75
85
|
return context;
|
|
76
86
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
const authState = useContext(AuthStateContext);
|
|
80
|
-
if (authState?.isLoading) return /*#__PURE__*/ jsx(Fragment, {
|
|
81
|
-
children: fallback
|
|
82
|
-
});
|
|
83
|
-
return /*#__PURE__*/ jsx(CaslCan, {
|
|
84
|
-
...props
|
|
85
|
-
});
|
|
87
|
+
function useAuthAbility() {
|
|
88
|
+
return useContext(AbilityContext);
|
|
86
89
|
}
|
|
87
|
-
|
|
90
|
+
const Can = createContextualCan(AbilityContext.Consumer);
|
|
91
|
+
const useCanRole = function({ roles }) {
|
|
88
92
|
const ability = useContext(AbilityContext);
|
|
89
|
-
const authState = useContext(AuthStateContext);
|
|
90
93
|
const allowed = !roles || 0 === roles.length || roles.length > 0 && roles.some((role)=>ability.can(role, ROLE_SUBJECT));
|
|
91
|
-
return
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
function CanRole({ children, roles, fallback = null }) {
|
|
97
|
-
const { allowed, isLoading } = useCanRole({
|
|
94
|
+
return !!allowed;
|
|
95
|
+
};
|
|
96
|
+
function CanRole({ children, roles }) {
|
|
97
|
+
const allowed = useCanRole({
|
|
98
98
|
roles
|
|
99
99
|
});
|
|
100
|
-
if (isLoading) return /*#__PURE__*/ jsx(Fragment, {
|
|
101
|
-
children: fallback
|
|
102
|
-
});
|
|
103
100
|
return allowed ? /*#__PURE__*/ jsx(Fragment, {
|
|
104
101
|
children: children
|
|
105
102
|
}) : null;
|
|
106
103
|
}
|
|
107
|
-
|
|
104
|
+
function useUserPermissions() {
|
|
105
|
+
return useContext(PermissionsContext);
|
|
106
|
+
}
|
|
107
|
+
function useCanPermission(permissions, match = 'any') {
|
|
108
|
+
const userPermissions = useContext(PermissionsContext);
|
|
109
|
+
if (!permissions || 0 === permissions.length) return true;
|
|
110
|
+
const permSet = new Set(userPermissions);
|
|
111
|
+
return 'all' === match ? permissions.every((p)=>permSet.has(p)) : permissions.some((p)=>permSet.has(p));
|
|
112
|
+
}
|
|
113
|
+
function CanPermission({ children, permissions, match = 'any', fallback = null }) {
|
|
114
|
+
const allowed = useCanPermission(permissions, match);
|
|
115
|
+
return allowed ? /*#__PURE__*/ jsx(Fragment, {
|
|
116
|
+
children: children
|
|
117
|
+
}) : /*#__PURE__*/ jsx(Fragment, {
|
|
118
|
+
children: fallback
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
export { AbilityContext, AuthProvider, Can, CanPermission, CanRole, getAbility, useAuth, useAuthAbility, useCanPermission, useCanRole, useUserPermissions };
|
package/lib/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
export type { PermissionApiResponse, PermissionApiConfig, AuthSdkConfig, } from './types';
|
|
8
8
|
export { ROLE_SUBJECT } from './ability-factory';
|
|
9
9
|
export { PermissionClient } from './permission-client';
|
|
10
|
-
export { AuthProvider, useAuth, CanRole, AbilityContext, } from './AuthProvider';
|
|
10
|
+
export { AuthProvider, useAuth, CanRole, AbilityContext, useUserPermissions, useCanPermission, CanPermission, } from './AuthProvider';
|
|
11
|
+
export { CanPermission as CanPerm } from './AuthProvider';
|
|
11
12
|
export type { AuthProviderProps } from './AuthProvider';
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,GACd,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EACL,YAAY,EACZ,OAAO,EACP,OAAO,EACP,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EACV,qBAAqB,EACrB,mBAAmB,EACnB,aAAa,GACd,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,OAAO,EACL,YAAY,EACZ,OAAO,EACP,OAAO,EACP,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,GACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,aAAa,IAAI,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { ROLE_SUBJECT } from "./ability-factory.js";
|
|
2
2
|
import { PermissionClient } from "./permission-client.js";
|
|
3
|
-
import { AbilityContext, AuthProvider, CanRole, useAuth } from "./AuthProvider.js";
|
|
4
|
-
export { AbilityContext, AuthProvider, CanRole, PermissionClient, ROLE_SUBJECT, useAuth };
|
|
3
|
+
import { AbilityContext, AuthProvider, CanPermission, CanRole, useAuth, useCanPermission, useUserPermissions } from "./AuthProvider.js";
|
|
4
|
+
export { AbilityContext, AuthProvider, CanPermission as CanPerm, CanPermission, CanRole, PermissionClient, ROLE_SUBJECT, useAuth, useCanPermission, useUserPermissions };
|
|
@@ -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;AAG1E;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAIvC;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAoDxD;;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;AAG1E;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAsB;gBAExB,MAAM,EAAE,mBAAmB;IAIvC;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,qBAAqB,CAAC;IAoDxD;;OAEG;IACG,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA4C1E;;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
|
@@ -42,6 +42,32 @@ class PermissionClient {
|
|
|
42
42
|
throw error;
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
|
+
async fetchUserPermissions(config) {
|
|
46
|
+
const { url, timeout = 5000, headers = {} } = config;
|
|
47
|
+
const requestHeaders = {
|
|
48
|
+
...headers,
|
|
49
|
+
'Content-Type': 'application/json',
|
|
50
|
+
'X-Suda-Csrf-Token': window.csrfToken || ''
|
|
51
|
+
};
|
|
52
|
+
const controller = new AbortController();
|
|
53
|
+
const timeoutId = setTimeout(()=>controller.abort(), timeout);
|
|
54
|
+
try {
|
|
55
|
+
const response = await fetch(url, {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
headers: requestHeaders,
|
|
58
|
+
signal: controller.signal,
|
|
59
|
+
credentials: 'include'
|
|
60
|
+
});
|
|
61
|
+
clearTimeout(timeoutId);
|
|
62
|
+
if (!response.ok) throw new Error(`Permissions API returned ${response.status}: ${response.statusText}`);
|
|
63
|
+
const data = await response.json();
|
|
64
|
+
return data.data?.permissions || [];
|
|
65
|
+
} catch (error) {
|
|
66
|
+
clearTimeout(timeoutId);
|
|
67
|
+
if (error instanceof Error && 'AbortError' === error.name) throw new Error(`Permissions API request timeout after ${timeout}ms`);
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
45
71
|
updateConfig(config) {
|
|
46
72
|
this.config = {
|
|
47
73
|
...this.config,
|
package/lib/types.d.ts
CHANGED
|
@@ -35,6 +35,8 @@ export interface UserRole {
|
|
|
35
35
|
*/
|
|
36
36
|
export interface PermissionApiResponse {
|
|
37
37
|
roles: string[];
|
|
38
|
+
/** 用户的有效权限点位列表 */
|
|
39
|
+
permissions?: string[];
|
|
38
40
|
fetchedAt?: string | Date;
|
|
39
41
|
}
|
|
40
42
|
/**
|
|
@@ -63,6 +65,11 @@ export interface AuthSdkConfig {
|
|
|
63
65
|
* 权限 API 配置
|
|
64
66
|
*/
|
|
65
67
|
permissionApi?: PermissionApiConfig;
|
|
68
|
+
/**
|
|
69
|
+
* 权限点位 API 配置(可选)
|
|
70
|
+
* 配置后 AuthProvider 会额外请求用户的有效权限点位
|
|
71
|
+
*/
|
|
72
|
+
permissionsApi?: PermissionApiConfig;
|
|
66
73
|
/**
|
|
67
74
|
* 是否在初始化时使用获取权限
|
|
68
75
|
* @default false
|
package/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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"}
|
|
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,kBAAkB;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,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,cAAc,CAAC,EAAE,mBAAmB,CAAC;IAErC;;;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"}
|