@lanaqi/rsr 0.0.1-rc.0

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.
Files changed (46) hide show
  1. package/README.md +49 -0
  2. package/dist/access/aaa.d.ts +177 -0
  3. package/dist/access/addon.d.ts +92 -0
  4. package/dist/access/blocker.d.ts +94 -0
  5. package/dist/access/common.d.ts +63 -0
  6. package/dist/access/context.d.ts +162 -0
  7. package/dist/access/guarder.d.ts +173 -0
  8. package/dist/access/handler.d.ts +183 -0
  9. package/dist/access/index.d.ts +56 -0
  10. package/dist/access/manager.d.ts +109 -0
  11. package/dist/access/matcher.d.ts +70 -0
  12. package/dist/access/navigator.d.ts +33 -0
  13. package/dist/access/recorder.d.ts +291 -0
  14. package/dist/access/resource.d.ts +215 -0
  15. package/dist/access/storer.d.ts +197 -0
  16. package/dist/access/voter.d.ts +156 -0
  17. package/dist/addons/index.d.ts +4 -0
  18. package/dist/addons/micro.d.ts +53 -0
  19. package/dist/bridge.d.ts +8 -0
  20. package/dist/builder/blocker.d.ts +24 -0
  21. package/dist/builder/builder.d.ts +9 -0
  22. package/dist/builder/context.d.ts +112 -0
  23. package/dist/builder/guarder.d.ts +54 -0
  24. package/dist/builder/handler.d.ts +21 -0
  25. package/dist/builder/index.d.ts +48 -0
  26. package/dist/builder/manager.d.ts +55 -0
  27. package/dist/builder/matcher.d.ts +37 -0
  28. package/dist/builder/navigator.d.ts +22 -0
  29. package/dist/builder/recorder.d.ts +11 -0
  30. package/dist/builder/resource.d.ts +101 -0
  31. package/dist/builder/storer.d.ts +83 -0
  32. package/dist/builder/voter.d.ts +41 -0
  33. package/dist/index.d.ts +24 -0
  34. package/dist/index.js +1778 -0
  35. package/dist/security/blocker.d.ts +14 -0
  36. package/dist/security/index.d.ts +8 -0
  37. package/dist/security/provider.d.ts +31 -0
  38. package/dist/support/aaa.d.ts +29 -0
  39. package/dist/support/blocker.d.ts +28 -0
  40. package/dist/support/index.d.ts +20 -0
  41. package/dist/support/permission.d.ts +5 -0
  42. package/dist/support/signature.d.ts +21 -0
  43. package/dist/support/user.d.ts +14 -0
  44. package/dist/warpper/index.d.ts +4 -0
  45. package/dist/warpper/permission.d.ts +24 -0
  46. package/package.json +74 -0
package/README.md ADDED
@@ -0,0 +1,49 @@
1
+ # React Security Router
2
+
3
+ React 安全路由器
4
+
5
+ # 框架说明
6
+
7
+ rsr 是 react security router 的简写,一个基于 react router 实现路由级别控制的安全框架。
8
+
9
+ 功能简介:
10
+
11
+ - 认证与授权
12
+ - 权限检测
13
+ - 二次签证(签名:如要求再次输入密码等)
14
+ - 等等
15
+
16
+ # 版本兼容
17
+
18
+ 注意:不兼容 react router 7 版本,在 v7 😒 版本上的 `useBlocker` 逻辑变更了,暂时不考虑兼容。
19
+
20
+ # 简单例子
21
+
22
+ ``` tsx
23
+
24
+ export default withSecurityBlocker(Root, bundler => {
25
+ return bundler
26
+ .context(builder => {
27
+ return builder
28
+ // 可选层级权限
29
+ // .hierarchy('superadmin>admin;admin>users;users>guest')
30
+ .resource(rb => rb.patterns('/login', '/logout', '/denied', '/signature').anonymous().build())
31
+ .resource(rb => rb.patterns('/sheet').permissions('admin').signatured().build())
32
+ .resource(rb => rb.patterns('/*').authenticated().build())
33
+ .build();
34
+ })
35
+ .manager(builder => {
36
+ return builder
37
+ .behave({
38
+ notAuthenticationPath: '/login',
39
+ notSignaturePath: '/signature',
40
+ accessDeniedPath: '/denied',
41
+ })
42
+ .build();
43
+ })
44
+ // .addons()
45
+ .build()
46
+
47
+ });
48
+
49
+ ```
@@ -0,0 +1,177 @@
1
+ import type { AccessPermission, AccessPermissions } from './common';
2
+ /**
3
+ * 访问认证
4
+ */
5
+ export interface AccessAuthentication {
6
+ /**
7
+ * 是否已认证
8
+ */
9
+ isAuthenticated(): boolean;
10
+ /**
11
+ * 设置已认证
12
+ * @param authenticated 已认证
13
+ */
14
+ setAuthenticated(authenticated: boolean): void;
15
+ }
16
+ /**
17
+ * 访问授权
18
+ */
19
+ export interface AccessAuthorization {
20
+ /**
21
+ * 获取权限集合
22
+ */
23
+ getPermissions(): Set<AccessPermission>;
24
+ }
25
+ /**
26
+ * 访问数据表
27
+ */
28
+ export interface AccessDatasheet<Datasheet> {
29
+ /**
30
+ * 获取数据表
31
+ */
32
+ getDatasheet(): Datasheet;
33
+ }
34
+ /**
35
+ * 认证数据表
36
+ */
37
+ export type AuthenticationDatasheet<P = unknown> = P & {
38
+ /**
39
+ * 已认证
40
+ */
41
+ readonly authenticated: boolean;
42
+ };
43
+ /**
44
+ * 授权数据表
45
+ */
46
+ export type AuthorizationDatasheet<P = unknown> = P & {
47
+ /**
48
+ * 权限集合
49
+ */
50
+ readonly permissions: AccessPermissions | Set<AccessPermission>;
51
+ };
52
+ /**
53
+ * 用户数据表
54
+ */
55
+ export type UserDatasheet<P = unknown> = P & AuthenticationDatasheet<P> & AuthorizationDatasheet<P> & {
56
+ /**
57
+ * 无效的
58
+ */
59
+ readonly invalid?: boolean;
60
+ };
61
+ /**
62
+ * 简单认证
63
+ */
64
+ export declare class SimpleAuthentication<Datasheet> implements AccessAuthentication, AccessDatasheet<AuthenticationDatasheet<Datasheet>> {
65
+ /**
66
+ * 数据表
67
+ * @private
68
+ */
69
+ private readonly datasheet;
70
+ /**
71
+ * 已认证
72
+ * @private
73
+ */
74
+ private authenticated;
75
+ /**
76
+ * 构造函数
77
+ * @param datasheet 数据表
78
+ */
79
+ constructor(datasheet: AuthenticationDatasheet<Datasheet>);
80
+ /**
81
+ * 是否已认证
82
+ */
83
+ isAuthenticated(): boolean;
84
+ /**
85
+ * 设置已认证
86
+ * @param authenticated 已认证
87
+ */
88
+ setAuthenticated(authenticated: boolean): void;
89
+ /**
90
+ * 获取数据表
91
+ */
92
+ getDatasheet(): AuthenticationDatasheet<Datasheet>;
93
+ }
94
+ /**
95
+ * 简单授权
96
+ */
97
+ export declare class SimpleAuthorization<Datasheet> implements AccessAuthorization, AccessDatasheet<AuthorizationDatasheet<Datasheet>> {
98
+ /**
99
+ * 数据表
100
+ * @private
101
+ */
102
+ private readonly datasheet;
103
+ /**
104
+ * 权限集合
105
+ * @private
106
+ */
107
+ private readonly permissions;
108
+ /**
109
+ * 构造函数
110
+ * @param datasheet 数据表
111
+ */
112
+ constructor(datasheet: AuthorizationDatasheet<Datasheet>);
113
+ /**
114
+ * 获取权限集合
115
+ */
116
+ getPermissions(): Set<AccessPermission>;
117
+ /**
118
+ * 获取数据表
119
+ */
120
+ getDatasheet(): AuthorizationDatasheet<Datasheet>;
121
+ }
122
+ /**
123
+ * 简单用户
124
+ */
125
+ export declare class SimpleUser<Datasheet> implements AccessAuthentication, AccessAuthorization, AccessDatasheet<UserDatasheet<Datasheet>> {
126
+ /**
127
+ * 数据表
128
+ * @private
129
+ */
130
+ private readonly datasheet;
131
+ /**
132
+ * 权限集合
133
+ * @private
134
+ */
135
+ private readonly permissions;
136
+ /**
137
+ * 已认证
138
+ * @private
139
+ */
140
+ private authenticated;
141
+ /**
142
+ * 无效的
143
+ * @private
144
+ */
145
+ private invalid;
146
+ /**
147
+ * 构造函数
148
+ * @param datasheet 数据表
149
+ */
150
+ constructor(datasheet: UserDatasheet<Datasheet>);
151
+ /**
152
+ * 是否已认证
153
+ */
154
+ isAuthenticated(): boolean;
155
+ /**
156
+ * 设置已认证
157
+ * @param authenticated 已认证
158
+ */
159
+ setAuthenticated(authenticated: boolean): void;
160
+ /**
161
+ * 获取权限集合
162
+ */
163
+ getPermissions(): Set<AccessPermission>;
164
+ /**
165
+ * 获取数据表
166
+ */
167
+ getDatasheet(): UserDatasheet<Datasheet>;
168
+ /**
169
+ * 是否无效的
170
+ */
171
+ isInvalid(): boolean;
172
+ /**
173
+ * 设置无效的
174
+ * @param invalid 无效的
175
+ */
176
+ setInvalid(invalid: boolean): void;
177
+ }
@@ -0,0 +1,92 @@
1
+ import type { AccessDecision, AccessPath } from './common';
2
+ import type { AccessContext } from './context';
3
+ import type { AccessManager } from './manager';
4
+ import type { AccessResource } from './resource';
5
+ /**
6
+ * 访问插件
7
+ */
8
+ export interface AccessAddon {
9
+ /**
10
+ * 守护之前
11
+ * @param context 上下文
12
+ * @param manager 管理器
13
+ * @param currentPath 当前路径
14
+ * @param currentResource 当前资源
15
+ */
16
+ guardBefore(context: AccessContext, manager: AccessManager, currentPath: AccessPath, currentResource: AccessResource | null): void;
17
+ /**
18
+ * 守护之后
19
+ * @param context 上下文
20
+ * @param manager 管理器
21
+ * @param currentPath 当前路径
22
+ * @param currentResource 当前资源
23
+ * @param currentDecision 当前决策
24
+ */
25
+ guardAfter(context: AccessContext, manager: AccessManager, currentPath: AccessPath, currentResource: AccessResource | null, currentDecision: AccessDecision): void;
26
+ /**
27
+ * 许可之前
28
+ * @param context 上下文
29
+ * @param manager 管理器
30
+ * @param stayPath 停留路径
31
+ * @param blockPath 阻断路径
32
+ * @param stayResource 停留资源
33
+ * @param blockResource 阻断资源
34
+ */
35
+ permitBefore(context: AccessContext, manager: AccessManager, stayPath: AccessPath, blockPath: AccessPath, stayResource: AccessResource | null, blockResource: AccessResource | null): void;
36
+ /**
37
+ * 许可之后函数
38
+ * @param context 上下文
39
+ * @param manager 管理器
40
+ * @param stayPath 停留路径
41
+ * @param blockPath 阻断路径
42
+ * @param stayResource 停留资源
43
+ * @param blockResource 阻断资源
44
+ */
45
+ permitAfter(context: AccessContext, manager: AccessManager, stayPath: AccessPath, blockPath: AccessPath, stayResource: AccessResource | null, blockResource: AccessResource | null): void;
46
+ }
47
+ /**
48
+ * 访问插件集合
49
+ */
50
+ export type AccessAddons = AccessAddon[];
51
+ /**
52
+ * 抽象的访问插件
53
+ */
54
+ export declare abstract class AbstractAddon implements AccessAddon {
55
+ /**
56
+ * 守护之前
57
+ * @param context 上下文
58
+ * @param manager 管理器
59
+ * @param currentPath 当前路径
60
+ * @param currentResource 当前资源
61
+ */
62
+ guardBefore(context: AccessContext, manager: AccessManager, currentPath: AccessPath, currentResource: AccessResource | null): void;
63
+ /**
64
+ * 守护之后
65
+ * @param context 上下文
66
+ * @param manager 管理器
67
+ * @param currentPath 当前路径
68
+ * @param currentResource 当前资源
69
+ * @param currentDecision 当前决策
70
+ */
71
+ guardAfter(context: AccessContext, manager: AccessManager, currentPath: AccessPath, currentResource: AccessResource | null, currentDecision: AccessDecision): void;
72
+ /**
73
+ * 许可之前
74
+ * @param context 上下文
75
+ * @param manager 管理器
76
+ * @param stayPath 停留路径
77
+ * @param blockPath 阻断路径
78
+ * @param stayResource 停留资源
79
+ * @param blockResource 阻断资源
80
+ */
81
+ permitBefore(context: AccessContext, manager: AccessManager, stayPath: AccessPath, blockPath: AccessPath, stayResource: AccessResource | null, blockResource: AccessResource | null): void;
82
+ /**
83
+ * 许可之后函数
84
+ * @param context 上下文
85
+ * @param manager 管理器
86
+ * @param stayPath 停留路径
87
+ * @param blockPath 阻断路径
88
+ * @param stayResource 停留资源
89
+ * @param blockResource 阻断资源
90
+ */
91
+ permitAfter(context: AccessContext, manager: AccessManager, stayPath: AccessPath, blockPath: AccessPath, stayResource: AccessResource | null, blockResource: AccessResource | null): void;
92
+ }
@@ -0,0 +1,94 @@
1
+ import type { AccessPath } from './common';
2
+ import type { AccessContext } from './context';
3
+ import type { AccessResource } from './resource';
4
+ /**
5
+ * 阻断处理器
6
+ * @param context 上下文
7
+ * @param currentPath 当前路径
8
+ * @param currentResource 当前资源
9
+ */
10
+ export type BlockHandler = (context: AccessContext, currentPath: AccessPath, currentResource: AccessResource | null) => boolean;
11
+ /**
12
+ * 访问阻断器
13
+ */
14
+ export interface AccessBlocker {
15
+ /**
16
+ * 进行阻断
17
+ * @param context 上下文
18
+ * @param currentPath 当前路径
19
+ * @param currentResource 当前资源
20
+ */
21
+ block(context: AccessContext, currentPath: AccessPath, currentResource: AccessResource | null): boolean;
22
+ /**
23
+ * 注册处理器
24
+ * @param handler 处理器
25
+ */
26
+ register(handler: BlockHandler): void;
27
+ /**
28
+ * 注销处理器
29
+ * @param handler 处理器
30
+ */
31
+ unregister(handler: BlockHandler): void;
32
+ }
33
+ /**
34
+ * 单一阻断器
35
+ */
36
+ export declare class SingleBlocker implements AccessBlocker {
37
+ /**
38
+ * 处理器
39
+ * @private
40
+ */
41
+ private handler?;
42
+ /**
43
+ * 进行阻断
44
+ * @param context 上下文
45
+ * @param currentPath 当前路径
46
+ * @param currentResource 当前资源
47
+ */
48
+ block(context: AccessContext, currentPath: AccessPath, currentResource: AccessResource): boolean;
49
+ /**
50
+ * 注册处理器
51
+ * @param handler 处理器
52
+ */
53
+ register(handler: BlockHandler): void;
54
+ /**
55
+ * 注销处理器
56
+ * @param handler 处理器
57
+ */
58
+ unregister(handler: BlockHandler): void;
59
+ }
60
+ /**
61
+ * 多个阻断器
62
+ */
63
+ export declare class MultiBlocker implements AccessBlocker {
64
+ /**
65
+ * 处理器集合
66
+ * @private
67
+ */
68
+ private readonly handlers;
69
+ /**
70
+ * 构造函数
71
+ */
72
+ constructor();
73
+ /**
74
+ * 进行阻断
75
+ * @param context 上下文
76
+ * @param currentPath 当前路径
77
+ * @param currentResource 当前资源
78
+ */
79
+ block(context: AccessContext, currentPath: AccessPath, currentResource: AccessResource): boolean;
80
+ /**
81
+ * 注册处理器
82
+ * @param handler 处理器
83
+ */
84
+ register(handler: BlockHandler): void;
85
+ /**
86
+ * 注销处理器
87
+ * @param handler 处理器
88
+ */
89
+ unregister(handler: BlockHandler): void;
90
+ /**
91
+ * 清理处理器集合
92
+ */
93
+ clear(): void;
94
+ }
@@ -0,0 +1,63 @@
1
+ import type { Path } from '../bridge';
2
+ /**
3
+ * 访问路径
4
+ */
5
+ export type AccessPath = Path;
6
+ /**
7
+ * 访问权限
8
+ */
9
+ export type AccessPermission = string;
10
+ /**
11
+ * 访问权限集合
12
+ */
13
+ export type AccessPermissions = AccessPermission[];
14
+ /**
15
+ * 访问决策
16
+ */
17
+ export declare enum AccessDecision {
18
+ /**
19
+ * 没有资源
20
+ */
21
+ notResource = "notResource",
22
+ /**
23
+ * 没有认证
24
+ */
25
+ notAuthentication = "notAuthentication",
26
+ /**
27
+ * 无效认证
28
+ */
29
+ invalidAuthentication = "invalidAuthentication",
30
+ /**
31
+ * 没有授权
32
+ */
33
+ notAuthorization = "notAuthorization",
34
+ /**
35
+ * 没有签名
36
+ */
37
+ notSignature = "notSignature",
38
+ /**
39
+ * 访问拒绝
40
+ */
41
+ accessDenied = "accessDenied",
42
+ /**
43
+ * 允许访问
44
+ */
45
+ allowAccess = "allowAccess"
46
+ }
47
+ /**
48
+ * 访问行为
49
+ */
50
+ export declare enum AccessBehave {
51
+ /**
52
+ * 什么都不做
53
+ */
54
+ doNothing = "doNothing",
55
+ /**
56
+ * 跳转导航
57
+ */
58
+ goNavigate = "goNavigate",
59
+ /**
60
+ * 重新决策
61
+ */
62
+ reDecision = "reDecision"
63
+ }
@@ -0,0 +1,162 @@
1
+ import type { AccessMatcher } from './matcher';
2
+ import type { AccessNavigator } from './navigator';
3
+ import type { AccessRecorder } from './recorder';
4
+ import type { AccessStorer } from './storer';
5
+ import type { AccessVoter } from './voter';
6
+ /**
7
+ * 访问上下文
8
+ */
9
+ export interface AccessContext {
10
+ /**
11
+ * 获取记录器
12
+ */
13
+ getRecorder(): AccessRecorder;
14
+ /**
15
+ * 设置记录器
16
+ * @param recorder 记录器
17
+ */
18
+ setRecorder(recorder: AccessRecorder): void;
19
+ /**
20
+ * 获取投票器
21
+ */
22
+ getVoter(): AccessVoter;
23
+ /**
24
+ * 设置投票器
25
+ * @param voter 投票器
26
+ */
27
+ setVoter(voter: AccessVoter): void;
28
+ /**
29
+ * 获取存储器
30
+ */
31
+ getStorer(): AccessStorer;
32
+ /**
33
+ * 设置存储器
34
+ * @param storer 存储器
35
+ */
36
+ setStorer(storer: AccessStorer): void;
37
+ /**
38
+ * 获取匹配器
39
+ */
40
+ getMatcher(): AccessMatcher;
41
+ /**
42
+ * 设置匹配器
43
+ * @param matcher 匹配器
44
+ */
45
+ setMatcher(matcher: AccessMatcher): void;
46
+ /**
47
+ * 获取导航器
48
+ */
49
+ getNavigator(): AccessNavigator;
50
+ /**
51
+ * 设置导航器
52
+ * @param navigator 导航器
53
+ */
54
+ setNavigator(navigator: AccessNavigator): void;
55
+ /**
56
+ * 获取父级
57
+ */
58
+ getParent(): AccessContext | undefined;
59
+ /**
60
+ * 设置父级
61
+ * @param parent 父级
62
+ */
63
+ setParent(parent: AccessContext): void;
64
+ }
65
+ /**
66
+ * 简单上下文
67
+ */
68
+ export declare class SimpleContext implements AccessContext {
69
+ /**
70
+ * 记录器
71
+ * @private
72
+ */
73
+ private recorder;
74
+ /**
75
+ * 投票器
76
+ * @private
77
+ */
78
+ private voter;
79
+ /**
80
+ * 存储器
81
+ * @private
82
+ */
83
+ private storer;
84
+ /**
85
+ * 匹配器
86
+ * @private
87
+ */
88
+ private matcher;
89
+ /**
90
+ * 导航器
91
+ * @private
92
+ */
93
+ private navigator;
94
+ /**
95
+ * 父级
96
+ * @private
97
+ */
98
+ private parent?;
99
+ /**
100
+ * 构造函数
101
+ * @param recorder 记录器
102
+ * @param voter 投票器
103
+ * @param storer 存储器
104
+ * @param matcher 匹配器
105
+ * @param navigator 导航器
106
+ */
107
+ constructor(recorder: AccessRecorder, voter: AccessVoter, storer: AccessStorer, matcher: AccessMatcher, navigator: AccessNavigator);
108
+ /**
109
+ * 获取记录器
110
+ */
111
+ getRecorder(): AccessRecorder;
112
+ /**
113
+ * 设置记录器
114
+ * @param recorder 记录器
115
+ */
116
+ setRecorder(recorder: AccessRecorder): void;
117
+ /**
118
+ * 获取投票器
119
+ */
120
+ getVoter(): AccessVoter;
121
+ /**
122
+ * 设置投票器
123
+ * @param voter 投票器
124
+ */
125
+ setVoter(voter: AccessVoter): void;
126
+ /**
127
+ * 获取存储器
128
+ */
129
+ getStorer(): AccessStorer;
130
+ /**
131
+ * 设置存储器
132
+ * @param storer 存储器
133
+ */
134
+ setStorer(storer: AccessStorer): void;
135
+ /**
136
+ * 获取匹配器
137
+ */
138
+ getMatcher(): AccessMatcher;
139
+ /**
140
+ * 设置匹配器
141
+ * @param matcher 匹配器
142
+ */
143
+ setMatcher(matcher: AccessMatcher): void;
144
+ /**
145
+ * 获取导航器
146
+ */
147
+ getNavigator(): AccessNavigator;
148
+ /**
149
+ * 设置导航器
150
+ * @param navigator 导航器
151
+ */
152
+ setNavigator(navigator: AccessNavigator): void;
153
+ /**
154
+ * 获取父级
155
+ */
156
+ getParent(): AccessContext | undefined;
157
+ /**
158
+ * 设置父级
159
+ * @param parent 父级
160
+ */
161
+ setParent(parent?: AccessContext): void;
162
+ }