@iushev/react-rbac 1.0.48 → 1.0.50
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/lib/RbacContext.d.ts +4 -8
- package/lib/RbacContext.d.ts.map +1 -1
- package/lib/RbacContext.js +4 -29
- package/lib/useCheckAccess.js +5 -5
- package/package.json +5 -8
- package/src/RbacContext.tsx +9 -44
- package/src/useCheckAccess.ts +5 -5
package/lib/RbacContext.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { RuleParams,
|
|
2
|
+
import { RuleParams, Identity, BaseManager } from "@iushev/rbac";
|
|
3
3
|
export type RuleParamsFunction = () => RuleParams;
|
|
4
4
|
export type MatchFunction = () => boolean;
|
|
5
5
|
export type CheckAccessOptions = {
|
|
@@ -10,19 +10,15 @@ export type CheckAccessOptions = {
|
|
|
10
10
|
logging?: false | ((...args: any[]) => void);
|
|
11
11
|
};
|
|
12
12
|
export type RbacContextProps = {
|
|
13
|
-
rbacManager: BaseManager | null;
|
|
14
13
|
checkAccess: (options: CheckAccessOptions) => Promise<boolean>;
|
|
15
14
|
};
|
|
16
15
|
declare const RbacContext: React.Context<RbacContextProps | null>;
|
|
17
16
|
export declare const useRbac: () => RbacContextProps;
|
|
18
17
|
export type RbacProviderProps = {
|
|
19
|
-
identity: Identity
|
|
20
|
-
|
|
21
|
-
token: string;
|
|
22
|
-
ruleClasses: Map<string, RuleCtor<Rule>>;
|
|
23
|
-
afterInitManager?: (webManager: any) => void;
|
|
18
|
+
identity: Identity;
|
|
19
|
+
authManager: BaseManager;
|
|
24
20
|
children: React.ReactNode;
|
|
25
|
-
logging?:
|
|
21
|
+
logging?: ((...args: any[]) => void);
|
|
26
22
|
};
|
|
27
23
|
export declare const RbacProvider: React.FC<RbacProviderProps>;
|
|
28
24
|
export declare const RbacConsumer: React.Consumer<RbacContextProps | null>;
|
package/lib/RbacContext.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RbacContext.d.ts","sourceRoot":"","sources":["../src/RbacContext.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"RbacContext.d.ts","sourceRoot":"","sources":["../src/RbacContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAEhE,OAAO,EAAE,UAAU,EAAuB,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEtF,MAAM,MAAM,kBAAkB,GAAG,MAAM,UAAU,CAAC;AAClD,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC;AAC1C,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,UAAU,GAAG,kBAAkB,CAAC;IACzC,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC;CAC9C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE,CAAC;AAEF,QAAA,MAAM,WAAW,wCAAqD,CAAC;AAEvE,eAAO,MAAM,OAAO,QAAO,gBAM1B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC;CACtC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CA8BpD,CAAC;AAEF,eAAO,MAAM,YAAY,yCAAuB,CAAC;AAEjD,eAAe,WAAW,CAAC"}
|
package/lib/RbacContext.js
CHANGED
|
@@ -46,7 +46,6 @@ exports.RbacConsumer = exports.RbacProvider = exports.useRbac = void 0;
|
|
|
46
46
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
47
47
|
const react_1 = __importStar(require("react"));
|
|
48
48
|
const rbac_1 = require("@iushev/rbac");
|
|
49
|
-
const rbac_web_manager_1 = require("@iushev/rbac-web-manager");
|
|
50
49
|
const RbacContext = react_1.default.createContext(null);
|
|
51
50
|
const useRbac = () => {
|
|
52
51
|
const ctx = (0, react_1.useContext)(RbacContext);
|
|
@@ -56,47 +55,23 @@ const useRbac = () => {
|
|
|
56
55
|
return ctx;
|
|
57
56
|
};
|
|
58
57
|
exports.useRbac = useRbac;
|
|
59
|
-
const RbacProvider = ({ identity,
|
|
60
|
-
const [rbacManager, setRbacManager] = (0, react_1.useState)(null);
|
|
61
|
-
(0, react_1.useEffect)(() => {
|
|
62
|
-
const initRbac = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
63
|
-
const manager = new rbac_web_manager_1.WebManager({
|
|
64
|
-
path: rbacUrl,
|
|
65
|
-
authorization: () => {
|
|
66
|
-
return token;
|
|
67
|
-
},
|
|
68
|
-
logging,
|
|
69
|
-
});
|
|
70
|
-
ruleClasses.forEach((RuleClass, ruleName) => {
|
|
71
|
-
manager.ruleClasses.set(ruleName, RuleClass);
|
|
72
|
-
});
|
|
73
|
-
if (identity) {
|
|
74
|
-
yield manager.load();
|
|
75
|
-
}
|
|
76
|
-
setRbacManager(manager);
|
|
77
|
-
});
|
|
78
|
-
initRbac();
|
|
79
|
-
}, [identity, logging, rbacUrl, ruleClasses, token]);
|
|
58
|
+
const RbacProvider = ({ identity, authManager, children, logging, }) => {
|
|
80
59
|
const checkAccess = (0, react_1.useCallback)((_a) => __awaiter(void 0, [_a], void 0, function* ({ roles, allow = true, match, params = {}, logging: loggingOption = false }) {
|
|
81
|
-
if (!rbacManager) {
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
60
|
const matchCustom = (match) => {
|
|
85
61
|
if (!match) {
|
|
86
62
|
return true;
|
|
87
63
|
}
|
|
88
64
|
return match();
|
|
89
65
|
};
|
|
90
|
-
const user = new rbac_1.RbacUser(
|
|
66
|
+
const user = new rbac_1.RbacUser(authManager);
|
|
91
67
|
user.identity = identity;
|
|
92
68
|
return user.isSuperuser || ((yield (0, rbac_1.matchRole)({ user, roles, params, logging: loggingOption ? loggingOption : logging })) && matchCustom(match) && allow);
|
|
93
|
-
}), [identity,
|
|
69
|
+
}), [identity, authManager, logging]);
|
|
94
70
|
const value = (0, react_1.useMemo)(() => {
|
|
95
71
|
return {
|
|
96
|
-
rbacManager,
|
|
97
72
|
checkAccess,
|
|
98
73
|
};
|
|
99
|
-
}, [
|
|
74
|
+
}, [checkAccess]);
|
|
100
75
|
return (0, jsx_runtime_1.jsx)(RbacContext.Provider, { value: value, children: children });
|
|
101
76
|
};
|
|
102
77
|
exports.RbacProvider = RbacProvider;
|
package/lib/useCheckAccess.js
CHANGED
|
@@ -12,20 +12,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
const react_1 = require("react");
|
|
13
13
|
const RbacContext_1 = require("./RbacContext");
|
|
14
14
|
function useCheckAccess({ roles, allow, params, match, logging }) {
|
|
15
|
-
const
|
|
15
|
+
const { checkAccess } = (0, RbacContext_1.useRbac)();
|
|
16
16
|
const [state, setState] = (0, react_1.useState)({
|
|
17
17
|
checking: true,
|
|
18
18
|
hasAccess: false,
|
|
19
19
|
});
|
|
20
20
|
(0, react_1.useEffect)(() => {
|
|
21
21
|
let subscribed = true;
|
|
22
|
-
const
|
|
22
|
+
const _checkAccess = () => __awaiter(this, void 0, void 0, function* () {
|
|
23
23
|
setState({
|
|
24
24
|
checking: true,
|
|
25
25
|
hasAccess: false,
|
|
26
26
|
});
|
|
27
27
|
try {
|
|
28
|
-
const result = yield
|
|
28
|
+
const result = yield checkAccess({ roles, allow, params, match, logging });
|
|
29
29
|
if (subscribed) {
|
|
30
30
|
setState({
|
|
31
31
|
checking: false,
|
|
@@ -43,11 +43,11 @@ function useCheckAccess({ roles, allow, params, match, logging }) {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
});
|
|
46
|
-
|
|
46
|
+
_checkAccess();
|
|
47
47
|
return () => {
|
|
48
48
|
subscribed = false;
|
|
49
49
|
};
|
|
50
|
-
}, [
|
|
50
|
+
}, [roles, allow, params, match, logging, checkAccess]);
|
|
51
51
|
return state;
|
|
52
52
|
}
|
|
53
53
|
exports.default = useCheckAccess;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iushev/react-rbac",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.50",
|
|
4
4
|
"private": false,
|
|
5
5
|
"author": "Ivaylo Ushev",
|
|
6
6
|
"description": "",
|
|
@@ -17,15 +17,12 @@
|
|
|
17
17
|
"lint": "eslint src",
|
|
18
18
|
"preversion": "npm run build"
|
|
19
19
|
},
|
|
20
|
-
"dependencies": {
|
|
21
|
-
"http-status-codes": "^2.3.0"
|
|
22
|
-
},
|
|
23
20
|
"devDependencies": {
|
|
24
21
|
"@eslint/compat": "^2.0.0",
|
|
25
22
|
"@types/react": "^19.2.7",
|
|
26
23
|
"@types/react-dom": "^19.2.3",
|
|
27
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
28
|
-
"@typescript-eslint/parser": "^8.
|
|
24
|
+
"@typescript-eslint/eslint-plugin": "^8.51.0",
|
|
25
|
+
"@typescript-eslint/parser": "^8.51.0",
|
|
29
26
|
"eslint": "^9.39.2",
|
|
30
27
|
"eslint-config-prettier": "^10.1.8",
|
|
31
28
|
"eslint-plugin-prettier": "^5.5.4",
|
|
@@ -38,8 +35,8 @@
|
|
|
38
35
|
"typescript": "^5.9.3"
|
|
39
36
|
},
|
|
40
37
|
"peerDependencies": {
|
|
41
|
-
"@iushev/rbac": "^1.0.
|
|
42
|
-
"
|
|
38
|
+
"@iushev/rbac": "^1.0.66",
|
|
39
|
+
"http-status-codes": "^2.3.0",
|
|
43
40
|
"axios": "^1.13.2",
|
|
44
41
|
"react": "^17.0.0 || ^18.0.0 || ^19.0.0",
|
|
45
42
|
"react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
|
package/src/RbacContext.tsx
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import React, { useCallback, useContext,
|
|
1
|
+
import React, { useCallback, useContext, useMemo } from "react";
|
|
2
2
|
|
|
3
|
-
import { RuleParams,
|
|
4
|
-
import { WebManager } from "@iushev/rbac-web-manager";
|
|
3
|
+
import { RuleParams, RbacUser, matchRole, Identity, BaseManager } from "@iushev/rbac";
|
|
5
4
|
|
|
6
5
|
export type RuleParamsFunction = () => RuleParams;
|
|
7
6
|
export type MatchFunction = () => boolean;
|
|
@@ -14,7 +13,6 @@ export type CheckAccessOptions = {
|
|
|
14
13
|
};
|
|
15
14
|
|
|
16
15
|
export type RbacContextProps = {
|
|
17
|
-
rbacManager: BaseManager | null;
|
|
18
16
|
checkAccess: (options: CheckAccessOptions) => Promise<boolean>;
|
|
19
17
|
};
|
|
20
18
|
|
|
@@ -29,52 +27,20 @@ export const useRbac = (): RbacContextProps => {
|
|
|
29
27
|
};
|
|
30
28
|
|
|
31
29
|
export type RbacProviderProps = {
|
|
32
|
-
identity: Identity
|
|
33
|
-
|
|
34
|
-
token: string;
|
|
35
|
-
ruleClasses: Map<string, RuleCtor<Rule>>;
|
|
36
|
-
afterInitManager?: (webManager: any) => void;
|
|
30
|
+
identity: Identity;
|
|
31
|
+
authManager: BaseManager;
|
|
37
32
|
children: React.ReactNode;
|
|
38
|
-
logging?:
|
|
33
|
+
logging?: ((...args: any[]) => void);
|
|
39
34
|
};
|
|
40
35
|
|
|
41
36
|
export const RbacProvider: React.FC<RbacProviderProps> = ({
|
|
42
37
|
identity,
|
|
43
|
-
|
|
44
|
-
token,
|
|
45
|
-
ruleClasses,
|
|
38
|
+
authManager,
|
|
46
39
|
children,
|
|
47
40
|
logging,
|
|
48
41
|
}) => {
|
|
49
|
-
const [rbacManager, setRbacManager] = useState<BaseManager | null>(null);
|
|
50
|
-
|
|
51
|
-
useEffect(() => {
|
|
52
|
-
const initRbac = async () => {
|
|
53
|
-
const manager = new WebManager({
|
|
54
|
-
path: rbacUrl,
|
|
55
|
-
authorization: () => {
|
|
56
|
-
return token;
|
|
57
|
-
},
|
|
58
|
-
logging,
|
|
59
|
-
});
|
|
60
|
-
ruleClasses.forEach((RuleClass, ruleName) => {
|
|
61
|
-
manager.ruleClasses.set(ruleName, RuleClass);
|
|
62
|
-
});
|
|
63
|
-
if (identity) {
|
|
64
|
-
await manager.load();
|
|
65
|
-
}
|
|
66
|
-
setRbacManager(manager);
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
initRbac();
|
|
70
|
-
}, [identity, logging, rbacUrl, ruleClasses, token]);
|
|
71
|
-
|
|
72
42
|
const checkAccess = useCallback(
|
|
73
43
|
async ({ roles, allow = true, match, params = {}, logging: loggingOption = false }: CheckAccessOptions) => {
|
|
74
|
-
if (!rbacManager) {
|
|
75
|
-
return false;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
44
|
const matchCustom = (match?: MatchFunction) => {
|
|
79
45
|
if (!match) {
|
|
80
46
|
return true;
|
|
@@ -82,20 +48,19 @@ export const RbacProvider: React.FC<RbacProviderProps> = ({
|
|
|
82
48
|
return match();
|
|
83
49
|
};
|
|
84
50
|
|
|
85
|
-
const user = new RbacUser(
|
|
51
|
+
const user = new RbacUser(authManager);
|
|
86
52
|
user.identity = identity;
|
|
87
53
|
|
|
88
54
|
return user.isSuperuser || ((await matchRole({ user, roles, params, logging: loggingOption ? loggingOption : logging })) && matchCustom(match) && allow);
|
|
89
55
|
},
|
|
90
|
-
[identity,
|
|
56
|
+
[identity, authManager, logging],
|
|
91
57
|
);
|
|
92
58
|
|
|
93
59
|
const value = useMemo(() => {
|
|
94
60
|
return {
|
|
95
|
-
rbacManager,
|
|
96
61
|
checkAccess,
|
|
97
62
|
};
|
|
98
|
-
}, [
|
|
63
|
+
}, [checkAccess]);
|
|
99
64
|
|
|
100
65
|
return <RbacContext.Provider value={value}>{children}</RbacContext.Provider>;
|
|
101
66
|
};
|
package/src/useCheckAccess.ts
CHANGED
|
@@ -7,7 +7,7 @@ export type CheckAccessState = {
|
|
|
7
7
|
};
|
|
8
8
|
|
|
9
9
|
function useCheckAccess({ roles, allow, params, match, logging }: CheckAccessOptions) {
|
|
10
|
-
const
|
|
10
|
+
const { checkAccess } = useRbac();
|
|
11
11
|
|
|
12
12
|
const [state, setState] = useState<CheckAccessState>({
|
|
13
13
|
checking: true,
|
|
@@ -17,14 +17,14 @@ function useCheckAccess({ roles, allow, params, match, logging }: CheckAccessOpt
|
|
|
17
17
|
useEffect(() => {
|
|
18
18
|
let subscribed = true;
|
|
19
19
|
|
|
20
|
-
const
|
|
20
|
+
const _checkAccess = async () => {
|
|
21
21
|
setState({
|
|
22
22
|
checking: true,
|
|
23
23
|
hasAccess: false,
|
|
24
24
|
});
|
|
25
25
|
|
|
26
26
|
try {
|
|
27
|
-
const result = await
|
|
27
|
+
const result = await checkAccess({ roles, allow, params, match, logging });
|
|
28
28
|
if (subscribed) {
|
|
29
29
|
setState({
|
|
30
30
|
checking: false,
|
|
@@ -42,12 +42,12 @@ function useCheckAccess({ roles, allow, params, match, logging }: CheckAccessOpt
|
|
|
42
42
|
}
|
|
43
43
|
};
|
|
44
44
|
|
|
45
|
-
|
|
45
|
+
_checkAccess();
|
|
46
46
|
|
|
47
47
|
return () => {
|
|
48
48
|
subscribed = false;
|
|
49
49
|
};
|
|
50
|
-
}, [
|
|
50
|
+
}, [roles, allow, params, match, logging, checkAccess]);
|
|
51
51
|
|
|
52
52
|
return state;
|
|
53
53
|
}
|