-
Notifications
You must be signed in to change notification settings - Fork 3.6k
/
authz.go
95 lines (79 loc) · 2.32 KB
/
authz.go
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
89
90
91
92
93
94
95
package platform
import "fmt"
// Authorizer will authorize a permission.
type Authorizer interface {
// Allowed returns true is the associated permission is allowed by the authorizer
Allowed(p Permission) bool
// ID returns an identifier used for auditing.
Identifier() ID
// Kind metadata for auditing.
Kind() string
}
func allowed(p Permission, ps []Permission) bool {
for _, perm := range ps {
if perm.Action == p.Action && perm.Resource == p.Resource {
return true
}
}
return false
}
type action string
const (
// ReadAction is the action for reading.
ReadAction action = "read"
// WriteAction is the action for writing.
WriteAction action = "write"
// CreateAction is the action for creating new resources.
CreateAction action = "create"
// DeleteAction is the action for deleting an existing resource.
DeleteAction action = "delete"
)
type resource string
const (
// UserResource represents the user resource actions can apply to.
UserResource = resource("user")
// OrganizationResource represents the org resource actions can apply to.
OrganizationResource = resource("org")
)
// TaskResource represents the task resource scoped to an organization.
func TaskResource(orgID ID) resource {
return resource(fmt.Sprintf("org/%s/task", orgID))
}
// BucketResource constructs a bucket resource.
func BucketResource(id ID) resource {
return resource(fmt.Sprintf("bucket/%s", id))
}
// Permission defines an action and a resource.
type Permission struct {
Action action `json:"action"`
Resource resource `json:"resource"`
}
func (p Permission) String() string {
return fmt.Sprintf("%s:%s", p.Action, p.Resource)
}
var (
// CreateUserPermission is a permission for creating users.
CreateUserPermission = Permission{
Action: CreateAction,
Resource: UserResource,
}
// DeleteUserPermission is a permission for deleting users.
DeleteUserPermission = Permission{
Action: DeleteAction,
Resource: UserResource,
}
)
// ReadBucketPermission constructs a permission for reading a bucket.
func ReadBucketPermission(id ID) Permission {
return Permission{
Action: ReadAction,
Resource: BucketResource(id),
}
}
// WriteBucketPermission constructs a permission for writing to a bucket.
func WriteBucketPermission(id ID) Permission {
return Permission{
Action: WriteAction,
Resource: BucketResource(id),
}
}