caber 0.1.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +82 -4
- data/app/models/concerns/caber/object.rb +22 -0
- data/app/models/concerns/caber/subject.rb +6 -0
- data/lib/caber/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71093a528267100a6e810a9906de6dc3bde29357d54f9b4557926c0d9ce5852b
|
4
|
+
data.tar.gz: cdcfda7d716bc8e5f9fd307d803ce8eba968477e724a872e03f8e088c02da0a5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 47d31508f48f5390523980e2507e6654412f4eca34e5af152cbb704fb4b7b72a35020189edf1afe41e04db3f88cd080f69f815a0546578e1719734c88a147b06
|
7
|
+
data.tar.gz: 2b48730f693d2ca3425ae70d2df0f950dfaa6dc24a353cbcba06bd08696772ed3cf3c668b2cce7c28e2b99d536ef87ac79ba76adb342fc03e4d6bccd164f4f73
|
data/README.md
CHANGED
@@ -37,13 +37,21 @@ end
|
|
37
37
|
Now you're ready to grant some permissions! To give someone permission on something:
|
38
38
|
|
39
39
|
```
|
40
|
-
document.grant_permission_to
|
40
|
+
document.grant_permission_to "viewer", user
|
41
41
|
```
|
42
42
|
|
43
43
|
You can query permissions in both directions:
|
44
44
|
```
|
45
|
-
document.grants_permission_to?
|
46
|
-
user.
|
45
|
+
document.grants_permission_to? "viewer", user
|
46
|
+
user.has_permission_on? "viewer", document
|
47
|
+
```
|
48
|
+
|
49
|
+
You can also check more than one permission at once by passing an array.
|
50
|
+
The check will be positive if *either* are granted:
|
51
|
+
|
52
|
+
```
|
53
|
+
document.grants_permission_to? ["viewer", "editor"], user
|
54
|
+
user.has_permission_on? ["viewer", "editor"], document
|
47
55
|
```
|
48
56
|
|
49
57
|
### Global permissions
|
@@ -51,7 +59,68 @@ user.has_permission_to? :view, document
|
|
51
59
|
To grant or query permissions globally (for instance, for a public view permission), you can use a `nil` subject:
|
52
60
|
|
53
61
|
```
|
54
|
-
document.grant_permission_to
|
62
|
+
document.grant_permission_to "viewer", nil
|
63
|
+
```
|
64
|
+
|
65
|
+
### Relationships
|
66
|
+
|
67
|
+
In order to query lists of available objects, subjects need to be told what types they can be granted permission on. For each type, after including `Caber::Subject`, call `can_have_permissions_on` with the ActiveRecord class you want to be able to get lists of. `permitted_*` relationships are then automatically added for that type:
|
68
|
+
|
69
|
+
```
|
70
|
+
class User < ApplicationRecord
|
71
|
+
include Caber::Subject
|
72
|
+
can_have_permissions_on Document
|
73
|
+
end
|
74
|
+
|
75
|
+
user.permitted_documents
|
76
|
+
# => all documents with any granted permission
|
77
|
+
|
78
|
+
user.permitted_documents.with_permission "viewer"
|
79
|
+
# => all documents that the user has viewer permission on
|
80
|
+
|
81
|
+
user.permitted_documents.with_permission ["viewer", "editor"]
|
82
|
+
# => all documents that the user has viewer or editor permission on
|
83
|
+
|
84
|
+
```
|
85
|
+
|
86
|
+
The inverse relationship is also possible by specifying `can_grant_permissions_to` on objects:
|
87
|
+
|
88
|
+
```
|
89
|
+
class Document < ApplicationRecord
|
90
|
+
include Caber::Object
|
91
|
+
can_grant_permissions_to User
|
92
|
+
end
|
93
|
+
|
94
|
+
document.permitted_users
|
95
|
+
# => all users with any permission
|
96
|
+
|
97
|
+
document.permitted_users.with_permission "viewer"
|
98
|
+
# => all users with viewer permission
|
99
|
+
|
100
|
+
document.permitted_users.with_permission ["viewer", "editor"]
|
101
|
+
# => all users with viewer or editor permission
|
102
|
+
|
103
|
+
```
|
104
|
+
|
105
|
+
### Revoking permissions
|
106
|
+
|
107
|
+
You can revoke some or all permissions from a user:
|
108
|
+
|
109
|
+
```
|
110
|
+
# Remove a specific permission
|
111
|
+
document.revoke_permission("viewer", user)
|
112
|
+
|
113
|
+
# Remove all permissions from a user
|
114
|
+
document.revoke_all_permissions(user)
|
115
|
+
```
|
116
|
+
|
117
|
+
### Finding objects
|
118
|
+
|
119
|
+
You can get lists of objects that a user has some permission on:
|
120
|
+
|
121
|
+
```
|
122
|
+
Document.granted_to "viewer", user
|
123
|
+
# => All the documents that user has "viewer" permission on
|
55
124
|
```
|
56
125
|
|
57
126
|
## Development
|
@@ -67,3 +136,12 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/manyfo
|
|
67
136
|
## Code of Conduct
|
68
137
|
|
69
138
|
Everyone interacting in the Caber project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/manyfold3d/caber/blob/master/CODE_OF_CONDUCT.md).
|
139
|
+
|
140
|
+
## Acknowledgements
|
141
|
+
|
142
|
+
This gem was created as part of [Manyfold](https://manyfold.app), with funding from [NGI0 Entrust](https://nlnet.nl/entrust), a fund established by [NLnet](https://nlnet.nl) with financial support from the European Commission's [Next Generation Internet](https://ngi.eu) program.
|
143
|
+
|
144
|
+
[<img src="https://nlnet.nl/logo/banner.png" alt="NLnet foundation logo" width="20%" />](https://nlnet.nl)
|
145
|
+
[<img src="https://nlnet.nl/image/logos/NGI0_tag.svg" alt="NGI Zero Logo" width="20%" />](https://nlnet.nl/entrust)
|
146
|
+
|
147
|
+
Name: `"ReBAC".downcase.reverse`
|
@@ -2,6 +2,20 @@ module Caber::Object
|
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
4
|
included do
|
5
|
+
has_many :caber_relations, as: :object, class_name: "Caber::Relation", dependent: :destroy
|
6
|
+
scope :with_permission, ->(permission) { where("caber_relations.permission": permission) }
|
7
|
+
|
8
|
+
def self.can_grant_permissions_to(model)
|
9
|
+
has_many :"permitted_#{model.name.pluralize.parameterize}", through: :caber_relations, source: :subject, source_type: model.name
|
10
|
+
end
|
11
|
+
|
12
|
+
scope :granted_to, ->(permission, subject) {
|
13
|
+
includes(:caber_relations).where(
|
14
|
+
"caber_relations.subject_id": subject.id,
|
15
|
+
"caber_relations.subject_type": subject.class.name,
|
16
|
+
"caber_relations.permission": permission
|
17
|
+
)
|
18
|
+
}
|
5
19
|
end
|
6
20
|
|
7
21
|
def grant_permission_to(permission, subject)
|
@@ -11,4 +25,12 @@ module Caber::Object
|
|
11
25
|
def grants_permission_to?(permission, subject)
|
12
26
|
Caber::Relation.where(object: self, subject: [subject, nil], permission: permission).present?
|
13
27
|
end
|
28
|
+
|
29
|
+
def revoke_permission(permission, subject)
|
30
|
+
Caber::Relation.where(object: self, subject: subject, permission: permission).destroy_all
|
31
|
+
end
|
32
|
+
|
33
|
+
def revoke_all_permissions(subject)
|
34
|
+
Caber::Relation.where(object: self, subject: subject).destroy_all
|
35
|
+
end
|
14
36
|
end
|
@@ -2,6 +2,12 @@ module Caber::Subject
|
|
2
2
|
extend ActiveSupport::Concern
|
3
3
|
|
4
4
|
included do
|
5
|
+
has_many :caber_relations, as: :subject, class_name: "Caber::Relation", dependent: :destroy
|
6
|
+
scope :with_permission, ->(permission) { where("caber_relations.permission": permission) }
|
7
|
+
|
8
|
+
def self.can_have_permissions_on(model)
|
9
|
+
has_many :"permitted_#{model.name.pluralize.parameterize}", through: :caber_relations, source: :object, source_type: model.name
|
10
|
+
end
|
5
11
|
end
|
6
12
|
|
7
13
|
def has_permission_on?(permission, object)
|
data/lib/caber/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: caber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Smith
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-08-
|
11
|
+
date: 2024-08-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|