-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathpolicy.js
88 lines (70 loc) · 1.46 KB
/
policy.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
var compose = require("koa-compose");
var kasta = require("kasta");
// configurable list of avalilable roles and access levels
var config = {
// predefined roles
roles: [
"public",
"user",
"admin",
],
// available access levels
accessLevels: {
"public": "*",
"anonymous": [ "public" ],
"user": [ "user", "admin" ],
"admin": [ "admin" ],
"default": ["user"]
}
}
var acl = kasta(config);
var fort = function (level, bypass) {
var authentication = function * (next) {
try {
if (this.session.user) {
yield next;
} else {
this.throw(401);
}
} catch (err) {
this.throw(401);
}
}
var authorization = function * (next) {
try {
var roles = this.session.user.roles;
this.operations = [];
for (var i = 0; i < roles.length; i++) {
var role = roles[i];
if (role.bitMask & level.bitMask) {
this.operations.push(role.title);
}
}
if (this.operations.length > 0) {
yield next;
} else {
this.throw(403);
}
} catch (err) {
this.throw(403);
}
}
return compose([authentication, authorization]);
}
var policy = {
// API related policies
acl: acl,
api: {
filter: fort,
bypass: false,
apiBypass : ["/domains/logo/"],
levels: {
},
defaults: {
level: acl.accessLevels.user
}
},
// APP related policies
app: {}
};
module.exports = policy;