eaco 0.6.1 → 0.7.0
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.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/features/authorization_parse_error.feature +157 -0
- data/features/enterprise_authorization.feature +159 -0
- data/features/rails_integration.feature +1 -1
- data/features/role_based_authorization.feature +30 -7
- data/features/step_definitions/actor_steps.rb +29 -25
- data/features/step_definitions/enterprise_steps.rb +81 -0
- data/features/step_definitions/error_steps.rb +49 -0
- data/features/step_definitions/fixture_steps.rb +14 -0
- data/features/step_definitions/resource_steps.rb +16 -24
- data/features/support/env.rb +4 -2
- data/lib/eaco.rb +2 -0
- data/lib/eaco/actor.rb +4 -3
- data/lib/eaco/adapters/active_record.rb +1 -1
- data/lib/eaco/adapters/active_record/compatibility.rb +19 -14
- data/lib/eaco/adapters/active_record/compatibility/scoped.rb +25 -0
- data/lib/eaco/adapters/active_record/compatibility/v40.rb +11 -3
- data/lib/eaco/adapters/active_record/compatibility/v41.rb +14 -3
- data/lib/eaco/adapters/active_record/compatibility/v42.rb +10 -2
- data/lib/eaco/controller.rb +16 -3
- data/lib/eaco/coverage.rb +83 -0
- data/lib/eaco/cucumber/active_record.rb +13 -18
- data/lib/eaco/cucumber/active_record/department.rb +4 -0
- data/lib/eaco/cucumber/active_record/position.rb +2 -0
- data/lib/eaco/cucumber/active_record/schema.rb +20 -2
- data/lib/eaco/cucumber/active_record/user.rb +9 -0
- data/lib/eaco/cucumber/active_record/user/designators.rb +4 -1
- data/lib/eaco/cucumber/active_record/user/designators/authenticated.rb +54 -0
- data/lib/eaco/cucumber/active_record/user/designators/department.rb +58 -0
- data/lib/eaco/cucumber/active_record/user/designators/position.rb +53 -0
- data/lib/eaco/cucumber/active_record/user/designators/user.rb +4 -0
- data/lib/eaco/cucumber/world.rb +115 -5
- data/lib/eaco/designator.rb +7 -2
- data/lib/eaco/dsl.rb +9 -1
- data/lib/eaco/dsl/acl.rb +2 -2
- data/lib/eaco/dsl/actor.rb +6 -3
- data/lib/eaco/dsl/base.rb +5 -0
- data/lib/eaco/error.rb +10 -1
- data/lib/eaco/rake.rb +1 -0
- data/lib/eaco/rake/default_task.rb +29 -9
- data/lib/eaco/rake/utils.rb +38 -0
- data/lib/eaco/version.rb +1 -1
- data/spec/eaco/acl_spec.rb +34 -0
- data/spec/spec_helper.rb +3 -3
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c8f2901fb8524328d3e14a6c08607c553912b7a
|
4
|
+
data.tar.gz: cf36cc16c76467699d29576720a06e1ca612663e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0bf06b2c70e7dda0a6790d89d7b5e23ce0ebe97e49026001bff0af29f69844eeb7a5b8c1f54f8d01151d86e7d4b4a9911301ef2edbdafac1958cccfdf6be3522
|
7
|
+
data.tar.gz: 2c1c4a9acc88bd4b814e99e1110cabe9e5f5622f29183a90c95180ba378887463091eec7d58dd88436cdb843f1e296b8cd5708adc82062ecf9d866375f22e8ae
|
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
[](https://travis-ci.org/ifad/eaco)
|
4
4
|
[](https://coveralls.io/r/ifad/eaco) (*currently writing specs*)
|
5
5
|
[](https://codeclimate.com/github/ifad/eaco)
|
6
|
-
[](http://inch-ci.org/github/ifad/eaco
|
6
|
+
[](http://inch-ci.org/github/ifad/eaco)
|
7
7
|
[](http://badge.fury.io/rb/eaco)
|
8
8
|
|
9
9
|
Eacus, the holder of the keys of Hades, is an ACL-based authorization
|
@@ -52,9 +52,9 @@ Create `config/authorization.rb` [(rdoc)](http://www.rubydoc.info/github/ifad/ea
|
|
52
52
|
```ruby
|
53
53
|
# Defines `Document` to be an authorized resource.
|
54
54
|
#
|
55
|
-
# Adds Document.accessible_by and Document#allows
|
55
|
+
# Adds Document.accessible_by and Document#allows?
|
56
56
|
#
|
57
|
-
authorize Document, using: :
|
57
|
+
authorize Document, using: :pg_jsonb do
|
58
58
|
roles :owner, :editor, :reader
|
59
59
|
|
60
60
|
permissions do
|
@@ -0,0 +1,157 @@
|
|
1
|
+
Feature: Authorization rules error handling
|
2
|
+
When there's an error in the authorization rules,
|
3
|
+
it is reported in detail with a backtrace showing
|
4
|
+
where it happened.
|
5
|
+
|
6
|
+
Scenario: Giving rubbish
|
7
|
+
When I have a wrong authorization definition such as
|
8
|
+
"""
|
9
|
+
if you give me rubbish please go elsewhere
|
10
|
+
"""
|
11
|
+
Then I should receive a DSL error SyntaxError saying
|
12
|
+
"""
|
13
|
+
\(feature\):1: syntax error.+please go elsewhere
|
14
|
+
"""
|
15
|
+
|
16
|
+
Scenario: Referencing a non-existing model
|
17
|
+
When I have a wrong authorization definition such as
|
18
|
+
"""
|
19
|
+
authorize ::Nonexistant, using: :pg_jsonb
|
20
|
+
"""
|
21
|
+
Then I should receive a DSL error Eaco::Error saying
|
22
|
+
"""
|
23
|
+
uninitialized constant Nonexistant
|
24
|
+
"""
|
25
|
+
|
26
|
+
Scenario: Specifying an actor class with no Designators namespace
|
27
|
+
When I have a wrong authorization definition such as
|
28
|
+
"""
|
29
|
+
class ::Foo
|
30
|
+
end
|
31
|
+
|
32
|
+
actor Foo do
|
33
|
+
designators do
|
34
|
+
frobber yay: true
|
35
|
+
end
|
36
|
+
end
|
37
|
+
"""
|
38
|
+
Then I should receive a DSL error Eaco::Error saying
|
39
|
+
"""
|
40
|
+
Please put designators implementations in Foo::Designators
|
41
|
+
"""
|
42
|
+
|
43
|
+
Scenario: Specifing a non-existing designator implementation
|
44
|
+
When I have a wrong authorization definition on model User such as
|
45
|
+
"""
|
46
|
+
actor $MODEL do
|
47
|
+
designators do
|
48
|
+
fropper from: :sgurtz
|
49
|
+
end
|
50
|
+
end
|
51
|
+
"""
|
52
|
+
Then I should receive a DSL error Eaco::Error saying
|
53
|
+
"""
|
54
|
+
Implementation .+User::Designators::Fropper for Designator fropper not found
|
55
|
+
"""
|
56
|
+
|
57
|
+
Scenario: Badly specifying the designator options
|
58
|
+
When I have a wrong authorization definition on model User such as
|
59
|
+
"""
|
60
|
+
actor $MODEL do
|
61
|
+
designators do
|
62
|
+
user on_the_rocks: true
|
63
|
+
end
|
64
|
+
end
|
65
|
+
"""
|
66
|
+
Then I should receive a DSL error Eaco::Error saying
|
67
|
+
"""
|
68
|
+
The designator option :from is required
|
69
|
+
"""
|
70
|
+
|
71
|
+
Scenario: Badly specifying the permissions options
|
72
|
+
When I have a wrong authorization definition on model Document such as
|
73
|
+
"""
|
74
|
+
authorize $MODEL do
|
75
|
+
permissions do
|
76
|
+
reader "Asdrubbale"
|
77
|
+
end
|
78
|
+
end
|
79
|
+
"""
|
80
|
+
Then I should receive a DSL error Eaco::Error saying
|
81
|
+
"""
|
82
|
+
Invalid reader permission definition: "Asdrubbale"
|
83
|
+
"""
|
84
|
+
|
85
|
+
Scenario: Authorizing an Object with no known ORM
|
86
|
+
When I have a wrong authorization definition such as
|
87
|
+
"""
|
88
|
+
class ::Foo
|
89
|
+
end
|
90
|
+
|
91
|
+
authorize Foo
|
92
|
+
"""
|
93
|
+
Then I should receive a DSL error Eaco::Error saying
|
94
|
+
"""
|
95
|
+
Don't know how to persist ACLs using <Foo>'s ORM
|
96
|
+
"""
|
97
|
+
|
98
|
+
Scenario: Authorizing an Resource with no known .accessible_by
|
99
|
+
When I have a wrong authorization definition such as
|
100
|
+
"""
|
101
|
+
class ::Bar
|
102
|
+
attr_accessor :acl
|
103
|
+
end
|
104
|
+
|
105
|
+
authorize Bar
|
106
|
+
"""
|
107
|
+
Then I should receive a DSL error Eaco::Error saying
|
108
|
+
"""
|
109
|
+
Don't know how to look up authorized records on <Bar>'s ORM
|
110
|
+
"""
|
111
|
+
|
112
|
+
Scenario: Authorizing a Resource with a known ORM but without the acl field
|
113
|
+
When I have a wrong authorization definition on model Department such as
|
114
|
+
"""
|
115
|
+
authorize $MODEL
|
116
|
+
"""
|
117
|
+
Then I should receive a DSL error Eaco::Error saying
|
118
|
+
"""
|
119
|
+
Please define a jsonb column named `acl` on .+Department
|
120
|
+
"""
|
121
|
+
|
122
|
+
Scenario: Authorizing a Resource with a known ORM but unknown strategy
|
123
|
+
When I have a wrong authorization definition on model Document such as
|
124
|
+
"""
|
125
|
+
authorize $MODEL
|
126
|
+
"""
|
127
|
+
Then I should receive a DSL error Eaco::Error saying
|
128
|
+
"""
|
129
|
+
.+Document.+ORM.+ActiveRecord::Base.+ use one of the available strategies: pg_jsonb
|
130
|
+
"""
|
131
|
+
|
132
|
+
Scenario: Authorizing a Resource with the wrong ACL column type
|
133
|
+
When I have a wrong authorization definition such as
|
134
|
+
"""
|
135
|
+
class ::Grabach < ActiveRecord::Base
|
136
|
+
connection.create_table 'grabaches' do |t|
|
137
|
+
t.string :acl
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
authorize ::Grabach
|
142
|
+
"""
|
143
|
+
Then I should receive a DSL error Eaco::Error saying
|
144
|
+
"""
|
145
|
+
The `acl` column on Grabach must be of the jsonb type
|
146
|
+
"""
|
147
|
+
|
148
|
+
Scenario: Using an unsupported ActiveRecord version
|
149
|
+
When I am using ActiveRecord 3.0
|
150
|
+
And I have a wrong authorization definition on model Document such as
|
151
|
+
"""
|
152
|
+
authorize $MODEL
|
153
|
+
"""
|
154
|
+
Then I should receive a DSL error Eaco::Error saying
|
155
|
+
"""
|
156
|
+
Unsupported Active Record version: 30
|
157
|
+
"""
|
@@ -0,0 +1,159 @@
|
|
1
|
+
Feature: Role-based, flexible authorization
|
2
|
+
In an enterprise, rights might be granted to specific users, to any users,
|
3
|
+
or to specific departments or to specific positions in said departments.
|
4
|
+
|
5
|
+
Background:
|
6
|
+
Given I have an User actor defined as
|
7
|
+
"""
|
8
|
+
actor $MODEL do
|
9
|
+
designators do
|
10
|
+
authenticated from: :class
|
11
|
+
user from: :id
|
12
|
+
position from: :position_ids
|
13
|
+
department from: :department_names
|
14
|
+
end
|
15
|
+
end
|
16
|
+
"""
|
17
|
+
Given I have a Document resource defined as
|
18
|
+
"""
|
19
|
+
authorize $MODEL, using: :pg_jsonb do
|
20
|
+
roles :writer, :reader
|
21
|
+
|
22
|
+
role :reader, "R/O"
|
23
|
+
role :writer, "R/W"
|
24
|
+
|
25
|
+
permissions do
|
26
|
+
reader :read
|
27
|
+
writer reader, :write
|
28
|
+
end
|
29
|
+
end
|
30
|
+
"""
|
31
|
+
|
32
|
+
Given I have the following User records
|
33
|
+
| id | name |
|
34
|
+
| 1 | Dennis Ritchie |
|
35
|
+
| 2 | Rob Pike |
|
36
|
+
| 3 | William Gates |
|
37
|
+
| 4 | Steve Jobs |
|
38
|
+
| 5 | Tim Berners-Lee |
|
39
|
+
|
40
|
+
Given I have the following Department records
|
41
|
+
| id | name |
|
42
|
+
| 1 | ICT |
|
43
|
+
| 2 | BAR |
|
44
|
+
| 3 | COM |
|
45
|
+
|
46
|
+
Given I have the following Position records
|
47
|
+
| id | name | department_id | user_id |
|
48
|
+
| 1 | Director | 1 | 1 |
|
49
|
+
| 2 | Systems Analyst | 1 | 2 |
|
50
|
+
| 3 | Bartender | 2 | 3 |
|
51
|
+
| 4 | Director | 3 | 4 |
|
52
|
+
| 5 | Social Media Manager | 3 | 5 |
|
53
|
+
|
54
|
+
Given I have the following Document records
|
55
|
+
| name | acl |
|
56
|
+
| ICT Status Report | {"department:ICT":"reader", "position:1":"writer"} |
|
57
|
+
| ICT Budget Report | {"position:1":"writer"} |
|
58
|
+
| Cafeteria Menu | {"position:3":"writer", "authenticated:Eaco::Cucumber::ActiveRecord::User":"reader"} |
|
59
|
+
| Tim's Web Project | {"user:5":"writer", "position:2":"reader"} |
|
60
|
+
|
61
|
+
Scenario: The Director can access confidential document
|
62
|
+
When I am "Dennis Ritchie"
|
63
|
+
Then I can read the Document "ICT Status Report" being a writer
|
64
|
+
And I can write the Document "ICT Budget Report" being a writer
|
65
|
+
And I can read the Document "Cafeteria Menu" being a reader
|
66
|
+
But I can not read the Document "Tim's Web Project"
|
67
|
+
When I ask for Documents I can access, I get
|
68
|
+
| ICT Status Report |
|
69
|
+
| ICT Budget Report |
|
70
|
+
| Cafeteria Menu |
|
71
|
+
|
72
|
+
Scenario: Rob can see Tim's document
|
73
|
+
When I am "Rob Pike"
|
74
|
+
Then I can read the Documents "ICT Status Report, Tim's Web Project" being a reader
|
75
|
+
But I can not write the Document "Tim's Web Project" being a reader
|
76
|
+
When I ask for Documents I can access, I get
|
77
|
+
| ICT Status Report |
|
78
|
+
| Tim's Web Project |
|
79
|
+
| Cafeteria Menu |
|
80
|
+
|
81
|
+
Scenario: Tim can work on his project
|
82
|
+
When I am "Tim Berners-Lee"
|
83
|
+
Then I can not read the Document "ICT Status Report, ICT Budget Report"
|
84
|
+
And I can read the Document "Tim's Web Project" being a writer
|
85
|
+
And I can write the Document "Tim's Web Project" being a writer
|
86
|
+
When I ask for Documents I can access, I get
|
87
|
+
| Tim's Web Project |
|
88
|
+
| Cafeteria Menu |
|
89
|
+
|
90
|
+
Scenario: Bill is maintaining the Cafeteria Menu
|
91
|
+
When I am "William Gates"
|
92
|
+
Then I can not read the Documents "ICT Status Report, ICT Budget Report, Tim's Web Project"
|
93
|
+
But I can write the Document "Cafeteria Menu" being a writer
|
94
|
+
When I ask for Documents I can access, I get
|
95
|
+
| Cafeteria Menu |
|
96
|
+
|
97
|
+
Scenario: Steve can just read the menu
|
98
|
+
When I am "Steve Jobs"
|
99
|
+
Then I can not read the Documents "ICT Status Report, ICT Budget Report, Tim's Web Project"
|
100
|
+
And I can not write the Document "Cafeteria Menu" being a reader
|
101
|
+
But I can read the Document "Cafeteria Menu" being a reader
|
102
|
+
When I ask for Documents I can access, I get
|
103
|
+
| Cafeteria Menu |
|
104
|
+
|
105
|
+
Scenario: Resolving a specific user
|
106
|
+
When I parse the Designator "user:4"
|
107
|
+
Then it should describe itself as "User 'Steve Jobs'"
|
108
|
+
And it should have a label of "User"
|
109
|
+
And it should resolve itself to
|
110
|
+
| Steve Jobs |
|
111
|
+
|
112
|
+
Scenario: Resolving the ICT Director
|
113
|
+
When I make a Designator with "position" and "1"
|
114
|
+
Then it should describe itself as "Director in ICT"
|
115
|
+
And it should have a label of "Position"
|
116
|
+
And it should resolve itself to
|
117
|
+
| Dennis Ritchie |
|
118
|
+
|
119
|
+
Scenario: Resolving the ICT Department
|
120
|
+
When I parse the Designator "department:ICT"
|
121
|
+
Then it should describe itself as "ICT"
|
122
|
+
And it should have a label of "Department"
|
123
|
+
And it should resolve itself to
|
124
|
+
| Dennis Ritchie |
|
125
|
+
| Rob Pike |
|
126
|
+
|
127
|
+
Scenario: Resolving all authenticated users
|
128
|
+
When I make a Designator with "authenticated" and "Eaco::Cucumber::ActiveRecord::User"
|
129
|
+
Then it should describe itself as "Any authenticated user"
|
130
|
+
And it should have a label of "Any user"
|
131
|
+
And it should resolve itself to
|
132
|
+
| Dennis Ritchie |
|
133
|
+
| Rob Pike |
|
134
|
+
| William Gates |
|
135
|
+
| Steve Jobs |
|
136
|
+
| Tim Berners-Lee |
|
137
|
+
|
138
|
+
Scenario: Resolving different designators
|
139
|
+
When I have the following designators
|
140
|
+
| department:ICT |
|
141
|
+
| position:3 |
|
142
|
+
| user:1 |
|
143
|
+
Then they should resolve to
|
144
|
+
| Dennis Ritchie |
|
145
|
+
| Rob Pike |
|
146
|
+
| William Gates |
|
147
|
+
|
148
|
+
Scenario: Resolving an invalid designator
|
149
|
+
When I parse the invalid Designator "foo:on the rocks"
|
150
|
+
Then I should receive a Designator error Eaco::Error saying
|
151
|
+
"""
|
152
|
+
Designator not found: "foo"
|
153
|
+
"""
|
154
|
+
|
155
|
+
Scenario: Obtaining labels for roles
|
156
|
+
When I ask the Document the list of roles and labels
|
157
|
+
Then I should get the following roles and labels
|
158
|
+
| writer | R/W |
|
159
|
+
| reader | R/O |
|
@@ -18,25 +18,48 @@ Feature: Role-Based authorization
|
|
18
18
|
And I have an User actor defined as
|
19
19
|
"""
|
20
20
|
actor $MODEL do
|
21
|
+
admin do |user|
|
22
|
+
user.admin?
|
23
|
+
end
|
24
|
+
|
21
25
|
designators do
|
22
26
|
user from: :id
|
23
27
|
end
|
24
28
|
end
|
25
29
|
"""
|
26
|
-
Given I have an actor named Bob
|
27
|
-
And I have an actor named Tom
|
30
|
+
Given I have an User actor named "Bob"
|
31
|
+
And I have an User actor named "Tom"
|
28
32
|
|
29
33
|
Scenario: Discretionary access to a Resource
|
30
34
|
When I have a confidential Document named "Supa Dupa Fly"
|
31
|
-
And I grant Bob access to "Supa Dupa Fly" as a reader in quality of user
|
32
|
-
Then Bob should be able to read "Supa Dupa Fly"
|
33
|
-
|
35
|
+
And I grant Bob access to Document "Supa Dupa Fly" as a reader in quality of user
|
36
|
+
Then Bob should be able to read Document "Supa Dupa Fly"
|
37
|
+
But Bob should not be able to write Document "Supa Dupa Fly"
|
38
|
+
And Tom should not be able to read Document "Supa Dupa Fly"
|
39
|
+
But I revoke Bob access to Document "Supa Dupa Fly" in quality of user
|
40
|
+
Then Bob should not be able to read Document "Supa Dupa Fly"
|
34
41
|
|
35
42
|
Scenario: Extraction of accessible Resources
|
36
43
|
When I have a confidential Document named "Strategic Plan"
|
37
|
-
And I grant Bob access to "Strategic Plan" as a reader in quality of user
|
44
|
+
And I grant Bob access to Document "Strategic Plan" as a reader in quality of user
|
38
45
|
And I have a confidential Document named "For Tom"
|
39
|
-
And I grant Tom access to "For Tom" as a reader in quality of user
|
46
|
+
And I grant Tom access to Document "For Tom" as a reader in quality of user
|
40
47
|
And I have a confidential Document named "For no one"
|
41
48
|
Then Bob can see only "Strategic Plan" in the Document authorized list
|
42
49
|
And Tom can see only "For Tom" in the Document authorized list
|
50
|
+
|
51
|
+
Scenario: Admin can see everything
|
52
|
+
When I have an admin User actor named "Boss"
|
53
|
+
And I have a confidential Document named "For Bob"
|
54
|
+
And I grant Bob access to Document "For Bob" as a reader in quality of user
|
55
|
+
And I have a confidential Document named "For no one"
|
56
|
+
Then Bob can see only "For Bob" in the Document authorized list
|
57
|
+
But Boss can see "For Bob, For no one" in the Document authorized list
|
58
|
+
|
59
|
+
Scenario: Handling invalid roles
|
60
|
+
When I have a confidential Document named "Foo Bar"
|
61
|
+
And I grant Bob access to Document "Foo Bar" as an invalid role frupper in quality of zomg
|
62
|
+
Then I should receive a Resource error Eaco::Error saying
|
63
|
+
"""
|
64
|
+
The `frupper' role is not valid for .+Document' objects. Valid roles are: `reader, writer'
|
65
|
+
"""
|
@@ -1,37 +1,41 @@
|
|
1
|
-
Given(/I have an (\w+) actor defined as/) do |model_name,
|
2
|
-
|
3
|
-
|
4
|
-
eval_dsl author_definition, @actor_model
|
1
|
+
Given(/I have an (\w+) actor defined as/) do |model_name, actor_definition|
|
2
|
+
authorize_model model_name, actor_definition
|
5
3
|
end
|
6
4
|
|
7
|
-
Given(/I have an actor named (
|
8
|
-
|
9
|
-
|
10
|
-
actor.save!
|
5
|
+
Given(/I have an (\w+) actor named "(.+?)"/) do |model_name, actor_name|
|
6
|
+
register_actor model_name, actor_name
|
7
|
+
end
|
11
8
|
|
12
|
-
|
13
|
-
|
9
|
+
Given(/I have an admin (\w+) actor named "(.+?)"/) do |model_name, actor_name|
|
10
|
+
register_actor model_name, actor_name, admin: true
|
14
11
|
end
|
15
12
|
|
16
|
-
When(/I grant (\w+) access to "(.+?)" as a (\w+) in quality of (\w+)/) do |actor_name, resource_name, role_name, designator|
|
17
|
-
actor =
|
18
|
-
|
19
|
-
|
13
|
+
When(/I grant (\w+) access to (\w+) "(.+?)" as a (\w+) in quality of (\w+)/) do |actor_name, resource_model, resource_name, role_name, designator|
|
14
|
+
actor = fetch_actor(actor_name)
|
15
|
+
resource = fetch_resource(resource_model, resource_name)
|
16
|
+
|
17
|
+
resource.grant role_name, designator, actor
|
18
|
+
resource.save!
|
20
19
|
end
|
21
20
|
|
22
|
-
|
23
|
-
actor =
|
24
|
-
resource =
|
21
|
+
When(/I revoke (\w+) access to (\w+) "(.+?)" in quality of (\w+)/) do |actor_name, resource_model, resource_name, designator|
|
22
|
+
actor = fetch_actor(actor_name)
|
23
|
+
resource = fetch_resource(resource_model, resource_name)
|
25
24
|
|
26
|
-
|
27
|
-
|
28
|
-
end
|
25
|
+
resource.revoke designator, actor
|
26
|
+
resource.save!
|
29
27
|
end
|
30
28
|
|
31
|
-
Then(/^(\w+) should
|
32
|
-
actor =
|
33
|
-
|
34
|
-
|
35
|
-
|
29
|
+
Then(/^(\w+) should be able to (\w+) (\w+) "(.+?)"$/) do |actor_name, permission_name, resource_model, resource_name|
|
30
|
+
actor = fetch_actor(actor_name)
|
31
|
+
resource = fetch_resource(resource_model, resource_name)
|
32
|
+
|
33
|
+
expect(actor.can?(permission_name, resource)).to be(true)
|
36
34
|
end
|
37
35
|
|
36
|
+
Then(/^(\w+) should not be able to (\w+) (\w+) "(.+?)"$/) do |actor_name, permission_name, resource_model, resource_name|
|
37
|
+
actor = fetch_actor(actor_name)
|
38
|
+
resource = fetch_resource(resource_model, resource_name)
|
39
|
+
|
40
|
+
expect(actor.cannot?(permission_name, resource)).to be(true)
|
41
|
+
end
|