@latanda/auth-middleware 1.0.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/CHANGELOG.md +15 -0
- package/LICENSE +21 -0
- package/MIGRATION.md +29 -0
- package/README.md +438 -0
- package/examples/basic-usage.js +90 -0
- package/package.json +66 -0
- package/sql/schema.sql +126 -0
- package/src/index.js +43 -0
- package/src/jwt.js +186 -0
- package/src/middleware.js +256 -0
- package/src/rbac.js +180 -0
package/src/rbac.js
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Role-Based Access Control (RBAC) System
|
|
3
|
+
* Extracted from La Tanda production system
|
|
4
|
+
* Supports: ADMIN, MIT (Member-in-Trust), IT (Information Technology), USER
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Role hierarchy and permissions mapping
|
|
9
|
+
*/
|
|
10
|
+
const ROLES = {
|
|
11
|
+
ADMIN: {
|
|
12
|
+
name: 'ADMIN',
|
|
13
|
+
level: 100,
|
|
14
|
+
permissions: [
|
|
15
|
+
'full_access',
|
|
16
|
+
'user_management',
|
|
17
|
+
'system_config',
|
|
18
|
+
'approve_deposits',
|
|
19
|
+
'manage_groups',
|
|
20
|
+
'view_analytics',
|
|
21
|
+
'manage_roles',
|
|
22
|
+
'delete_users',
|
|
23
|
+
'system_settings'
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
MIT: {
|
|
27
|
+
name: 'MIT', // Member-in-Trust (Group coordinator)
|
|
28
|
+
level: 50,
|
|
29
|
+
permissions: [
|
|
30
|
+
'create_groups',
|
|
31
|
+
'manage_own_groups',
|
|
32
|
+
'approve_members',
|
|
33
|
+
'view_group_analytics',
|
|
34
|
+
'edit_group_settings'
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
IT: {
|
|
38
|
+
name: 'IT', // Information Technology (Developer/Support)
|
|
39
|
+
level: 75,
|
|
40
|
+
permissions: [
|
|
41
|
+
'view_system_logs',
|
|
42
|
+
'debug_access',
|
|
43
|
+
'api_access',
|
|
44
|
+
'view_analytics',
|
|
45
|
+
'technical_support'
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
USER: {
|
|
49
|
+
name: 'USER',
|
|
50
|
+
level: 10,
|
|
51
|
+
permissions: [
|
|
52
|
+
'view_own_profile',
|
|
53
|
+
'edit_own_profile',
|
|
54
|
+
'join_groups',
|
|
55
|
+
'make_payments',
|
|
56
|
+
'view_own_transactions'
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Check if user has specific permission
|
|
63
|
+
* @param {string} userRole - User's role (ADMIN, MIT, IT, USER)
|
|
64
|
+
* @param {string} requiredPermission - Permission to check
|
|
65
|
+
* @returns {boolean} True if user has permission
|
|
66
|
+
*/
|
|
67
|
+
function hasPermission(userRole, requiredPermission) {
|
|
68
|
+
const role = ROLES[userRole];
|
|
69
|
+
if (!role) return false;
|
|
70
|
+
|
|
71
|
+
// ADMIN has all permissions
|
|
72
|
+
if (userRole === 'ADMIN') return true;
|
|
73
|
+
|
|
74
|
+
return role.permissions.includes(requiredPermission);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Check if user has any of the specified permissions
|
|
79
|
+
* @param {string} userRole - User's role
|
|
80
|
+
* @param {string[]} permissions - Array of permissions to check
|
|
81
|
+
* @returns {boolean} True if user has at least one permission
|
|
82
|
+
*/
|
|
83
|
+
function hasAnyPermission(userRole, permissions) {
|
|
84
|
+
return permissions.some(permission => hasPermission(userRole, permission));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Check if user has all of the specified permissions
|
|
89
|
+
* @param {string} userRole - User's role
|
|
90
|
+
* @param {string[]} permissions - Array of permissions to check
|
|
91
|
+
* @returns {boolean} True if user has all permissions
|
|
92
|
+
*/
|
|
93
|
+
function hasAllPermissions(userRole, permissions) {
|
|
94
|
+
return permissions.every(permission => hasPermission(userRole, permission));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Check if user's role is at or above required level
|
|
99
|
+
* @param {string} userRole - User's role
|
|
100
|
+
* @param {string} requiredRole - Minimum required role
|
|
101
|
+
* @returns {boolean} True if user's role level meets requirement
|
|
102
|
+
*/
|
|
103
|
+
function hasRoleLevel(userRole, requiredRole) {
|
|
104
|
+
const userRoleData = ROLES[userRole];
|
|
105
|
+
const requiredRoleData = ROLES[requiredRole];
|
|
106
|
+
|
|
107
|
+
if (!userRoleData || !requiredRoleData) return false;
|
|
108
|
+
|
|
109
|
+
return userRoleData.level >= requiredRoleData.level;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Get all permissions for a role
|
|
114
|
+
* @param {string} role - Role name
|
|
115
|
+
* @returns {string[]} Array of permissions
|
|
116
|
+
*/
|
|
117
|
+
function getRolePermissions(role) {
|
|
118
|
+
const roleData = ROLES[role];
|
|
119
|
+
return roleData ? roleData.permissions : [];
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Check if role is valid
|
|
124
|
+
* @param {string} role - Role to validate
|
|
125
|
+
* @returns {boolean} True if role exists
|
|
126
|
+
*/
|
|
127
|
+
function isValidRole(role) {
|
|
128
|
+
return Object.keys(ROLES).includes(role);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Enforce resource ownership (user can only access their own resources)
|
|
133
|
+
* @param {string} userId - Authenticated user ID
|
|
134
|
+
* @param {string} resourceOwnerId - Resource owner ID
|
|
135
|
+
* @param {string} userRole - User's role (ADMINs bypass this check)
|
|
136
|
+
* @returns {boolean} True if user owns resource or is ADMIN
|
|
137
|
+
*/
|
|
138
|
+
function canAccessResource(userId, resourceOwnerId, userRole) {
|
|
139
|
+
// ADMIN can access all resources
|
|
140
|
+
if (userRole === 'ADMIN') return true;
|
|
141
|
+
|
|
142
|
+
// User must own the resource
|
|
143
|
+
return userId === resourceOwnerId;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Check if user can perform action on group
|
|
148
|
+
* @param {string} userId - Authenticated user ID
|
|
149
|
+
* @param {Object} group - Group object with creator_id
|
|
150
|
+
* @param {string} userRole - User's role
|
|
151
|
+
* @param {string} action - Action to perform (edit, delete, approve_members, etc.)
|
|
152
|
+
* @returns {boolean} True if action is allowed
|
|
153
|
+
*/
|
|
154
|
+
function canPerformGroupAction(userId, group, userRole, action) {
|
|
155
|
+
// ADMIN can do anything
|
|
156
|
+
if (userRole === 'ADMIN') return true;
|
|
157
|
+
|
|
158
|
+
// MIT can manage their own groups
|
|
159
|
+
if (userRole === 'MIT' && group.creator_id === userId) {
|
|
160
|
+
const mitActions = ['edit', 'delete', 'approve_members', 'manage_settings'];
|
|
161
|
+
return mitActions.includes(action);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Regular users can only view
|
|
165
|
+
if (action === 'view') return true;
|
|
166
|
+
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
module.exports = {
|
|
171
|
+
ROLES,
|
|
172
|
+
hasPermission,
|
|
173
|
+
hasAnyPermission,
|
|
174
|
+
hasAllPermissions,
|
|
175
|
+
hasRoleLevel,
|
|
176
|
+
getRolePermissions,
|
|
177
|
+
isValidRole,
|
|
178
|
+
canAccessResource,
|
|
179
|
+
canPerformGroupAction
|
|
180
|
+
};
|