summaryrefslogtreecommitdiffstats
path: root/backend/src/authz.js
diff options
context:
space:
mode:
authorJan Tuomi <jan.tuomi@eficode.com>2020-02-05 19:25:36 +0200
committerJan Tuomi <jan.tuomi@eficode.com>2020-02-05 19:25:36 +0200
commit71d9490d0988c97b8b023a70e0b61c65f32ad3b9 (patch)
treedf6f3db2c1f3c3ef9339843431a79197b465a74c /backend/src/authz.js
parent48a60c896d86de9bf76806ca60da35ef9f77259e (diff)
Implement permissions
Diffstat (limited to 'backend/src/authz.js')
-rw-r--r--backend/src/authz.js42
1 files changed, 42 insertions, 0 deletions
diff --git a/backend/src/authz.js b/backend/src/authz.js
new file mode 100644
index 0000000..94dfa85
--- /dev/null
+++ b/backend/src/authz.js
@@ -0,0 +1,42 @@
+const db = require('./db');
+
+const userHasPermission = async (user, permission_name) => {
+ const permission = await db('permissions').where({ name: permission_name }).first();
+ const userPermission = await db('users_permissions')
+ .where({ user_id: user.id, permission_id: permission.id })
+ .first();
+
+ return !!userPermission;
+};
+
+const userHasPermissions = async (user, permission_names) => {
+ for (permission_name of permission_names) {
+ const hasPermission = await userHasPermission(user, permission_name);
+ if (!hasPermission) {
+ return false;
+ }
+ }
+ return true;
+};
+
+const permissionMiddleware = permission_name => async (req, res, next) => {
+ const user = req.user;
+ const hasPermission = Array.isArray(permission_name)
+ ? await userHasPermissions(user, permission_name)
+ : await userHasPermission(user, permission_name);
+
+ if (hasPermission) {
+ await next();
+ } else {
+ res.status(401);
+ res.json({
+ error: 'Required permission missing.',
+ permission_name,
+ });
+ }
+};
+
+module.exports = {
+ userHasPermission,
+ permissionMiddleware,
+};