simon_says 0.3.0.alpha.3 → 0.3.0.alpha.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/simon_says/authorizer.rb +37 -10
- data/lib/simon_says/version.rb +1 -1
- data/test/rails_app/app/controllers/admin/comm_reports_controller.rb +9 -0
- data/test/rails_app/app/controllers/admin/reports_controller.rb +3 -1
- data/test/rails_app/app/models/client.rb +2 -0
- data/test/rails_app/db/migrate/20190711184853_create_clients.rb +7 -0
- data/test/rails_app/db/schema.rb +6 -1
- data/test/rails_app/test/fixtures/clients.yml +1 -0
- data/test/rails_app/test/models/client_test.rb +7 -0
- data/test/simon_says/authorizer_test.rb +35 -7
- data/test/test_helper.rb +1 -1
- metadata +13 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ebffb1d29f995636c2c9997b8e86a795b4a7ec08cc9dfcd6fd1bca31463203c
|
4
|
+
data.tar.gz: 0fb849d27ded008910437acd78b9470975b436702f917a52ae101f7ef6a0e2f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cdb55a962f39d5d0df49579a37cf997e4acba5fc41e375429ff38b2ffcaadd6b9377861e661ab573833f4fe8fe58eb9981ae9b8ab5c9ed5d5f7655290c9e022c
|
7
|
+
data.tar.gz: ea2a382c7226db07795804807280ee24e4c834bb9d7316a3122c62c718cea195a61a45504668150f208ed420f8b0f34a5613f5facc3bfe11a94397eeb244ff5e
|
@@ -12,6 +12,7 @@ module SimonSays
|
|
12
12
|
|
13
13
|
included do
|
14
14
|
class_attribute :default_authorization_scope
|
15
|
+
class_attribute :default_find_attribute
|
15
16
|
end
|
16
17
|
|
17
18
|
module ClassMethods
|
@@ -41,7 +42,10 @@ module SimonSays
|
|
41
42
|
# default, +:id+ is used
|
42
43
|
# @param opts [Symbol] :param_key params key for resource query; by default,
|
43
44
|
# +:id+ is used
|
44
|
-
# @param opts [Symbol] :through through model to use when finding
|
45
|
+
# @param opts [Symbol] :through through model to use when finding and
|
46
|
+
# authorizing the resource. Mutually exclusive with the :with option.
|
47
|
+
# @param opts [Symbol] :with what resource to authorize with. Mutually
|
48
|
+
# exclusive with the :through option.
|
45
49
|
# @param opts [Symbol] :namespace resource namespace
|
46
50
|
#
|
47
51
|
# @see #find_resource for finder option examples
|
@@ -87,22 +91,37 @@ module SimonSays
|
|
87
91
|
end
|
88
92
|
end
|
89
93
|
|
90
|
-
# Authorize against a given resource
|
94
|
+
# Authorize against a given resource. This resource should be an instance
|
95
|
+
# that includes Roleable.
|
91
96
|
#
|
92
97
|
# @param [Symbol, String] resource name of resource to find
|
93
98
|
# @param [Array<Symbol, String>] roles one or more role symbols or strings
|
94
99
|
# @param [Hash] opts before_action options
|
95
100
|
#
|
96
101
|
# @example Authorize resource
|
97
|
-
#
|
98
|
-
def
|
102
|
+
# authorize_with :admin, :support
|
103
|
+
def authorize_with(resource, *roles)
|
99
104
|
opts = roles.extract_options!
|
100
105
|
|
101
106
|
before_action action_options(opts) do
|
102
|
-
authorize roles, {
|
107
|
+
authorize roles, { with: resource }
|
103
108
|
end
|
104
109
|
end
|
105
110
|
|
111
|
+
# Authorize with the +default_authorization_scope+. The instance returned
|
112
|
+
# by the +default_authorization_scope+ should include Roleable.
|
113
|
+
#
|
114
|
+
# @param [Array<Symbol, String>] roles one or more role symbols or strings
|
115
|
+
# @param [Hash] opts before_action options
|
116
|
+
#
|
117
|
+
# @example Authorize "content" and "marketing" using the current Admin
|
118
|
+
# self.default_authorization_scope = :current_admin
|
119
|
+
#
|
120
|
+
# authorize :content, :marketing
|
121
|
+
def authorize(*roles)
|
122
|
+
authorize_with(default_authorization_scope, *roles)
|
123
|
+
end
|
124
|
+
|
106
125
|
# Extract before_action options from Hash
|
107
126
|
#
|
108
127
|
# @private
|
@@ -145,10 +164,15 @@ module SimonSays
|
|
145
164
|
# @param [Symbol, String] one or more required roles
|
146
165
|
# @param [Hash] options authorizer options
|
147
166
|
def authorize(required = nil, options)
|
148
|
-
if
|
149
|
-
name = through.to_s.singularize.to_sym
|
167
|
+
if options.key? :through
|
168
|
+
name = options[:through].to_s.singularize.to_sym
|
169
|
+
elsif options.key? :with
|
170
|
+
name = options[:with].to_s.singularize.to_sym
|
150
171
|
else
|
151
|
-
|
172
|
+
raise ArgumentError, 'find_and_authorize must be called with either '\
|
173
|
+
':through or :with option. The resource referenced by the value '\
|
174
|
+
'of this option should be an instance of a class that includes '\
|
175
|
+
'Roleable.'
|
152
176
|
end
|
153
177
|
|
154
178
|
record = instance_variable_get("@#{name}")
|
@@ -176,7 +200,7 @@ module SimonSays
|
|
176
200
|
# @private
|
177
201
|
def resource_scope_and_query(resource, options)
|
178
202
|
if options[:through]
|
179
|
-
field = "#{resource}_id"
|
203
|
+
field = :"#{resource}_id"
|
180
204
|
|
181
205
|
query = { field => params[field] } if params[field]
|
182
206
|
scope = send(self.class.default_authorization_scope)
|
@@ -191,7 +215,10 @@ module SimonSays
|
|
191
215
|
scope = klass.classify.constantize
|
192
216
|
end
|
193
217
|
|
194
|
-
field ||= options.fetch(:find_attribute
|
218
|
+
field ||= options.fetch(:find_attribute) do
|
219
|
+
self.class.default_find_attribute&.call(resource) || :id
|
220
|
+
end
|
221
|
+
|
195
222
|
query ||= { field => params[options.fetch(:param_key, :id)] }
|
196
223
|
|
197
224
|
return scope, query
|
data/lib/simon_says/version.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
class Admin::ReportsController < ApplicationController
|
2
2
|
respond_to :json
|
3
3
|
|
4
|
-
|
4
|
+
self.default_authorization_scope = :current_admin
|
5
|
+
|
6
|
+
authorize :support
|
5
7
|
find_resource :report, namespace: :admin, except: [:index, :new, :create]
|
6
8
|
|
7
9
|
def index
|
data/test/rails_app/db/schema.rb
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
#
|
11
11
|
# It's strongly recommended that you check this file into your version control system.
|
12
12
|
|
13
|
-
ActiveRecord::Schema.define(version:
|
13
|
+
ActiveRecord::Schema.define(version: 20190711184853) do
|
14
14
|
|
15
15
|
create_table "admin_reports", force: :cascade do |t|
|
16
16
|
t.string "title"
|
@@ -24,6 +24,11 @@ ActiveRecord::Schema.define(version: 20160823220959) do
|
|
24
24
|
t.datetime "updated_at", null: false
|
25
25
|
end
|
26
26
|
|
27
|
+
create_table "clients", primary_key: "client_id", force: :cascade do |t|
|
28
|
+
t.datetime "created_at", null: false
|
29
|
+
t.datetime "updated_at", null: false
|
30
|
+
end
|
31
|
+
|
27
32
|
create_table "documents", force: :cascade do |t|
|
28
33
|
t.string "title"
|
29
34
|
t.datetime "created_at", null: false
|
@@ -0,0 +1 @@
|
|
1
|
+
alice: {}
|
@@ -29,6 +29,25 @@ class AuthorizerTest < ActiveSupport::TestCase
|
|
29
29
|
@controller.params = { id: documents(:alpha).id }
|
30
30
|
end
|
31
31
|
|
32
|
+
def with_params(params)
|
33
|
+
default_params = @controller.params
|
34
|
+
@controller.params = params
|
35
|
+
|
36
|
+
yield
|
37
|
+
|
38
|
+
ensure
|
39
|
+
@controller.params = default_params
|
40
|
+
end
|
41
|
+
|
42
|
+
def with_default_find_attribute(callalbe)
|
43
|
+
@controller.class.default_find_attribute = callalbe
|
44
|
+
|
45
|
+
yield
|
46
|
+
|
47
|
+
ensure
|
48
|
+
@controller.class.default_find_attribute = nil
|
49
|
+
end
|
50
|
+
|
32
51
|
test "find_resource" do
|
33
52
|
@controller.find_resource :document
|
34
53
|
|
@@ -96,19 +115,19 @@ class AuthorizerTest < ActiveSupport::TestCase
|
|
96
115
|
test "authorize with membership role" do
|
97
116
|
@controller.instance_variable_set :@membership, documents(:alpha).memberships.first
|
98
117
|
|
99
|
-
assert @controller.authorize(:fork,
|
118
|
+
assert @controller.authorize(:fork, with: :membership)
|
100
119
|
end
|
101
120
|
|
102
121
|
test "authorize with current_admin" do
|
103
122
|
@controller.current_admin = admins(:support)
|
104
123
|
|
105
|
-
assert @controller.authorize(:support,
|
124
|
+
assert @controller.authorize(:support, with: :admin)
|
106
125
|
end
|
107
126
|
|
108
127
|
test "authorize with multiple roles" do
|
109
128
|
@controller.instance_variable_set :@membership, documents(:alpha).memberships.first
|
110
129
|
|
111
|
-
assert @controller.authorize([:update, :delete],
|
130
|
+
assert @controller.authorize([:update, :delete], with: :membership)
|
112
131
|
end
|
113
132
|
|
114
133
|
test "authorize with through" do
|
@@ -121,14 +140,14 @@ class AuthorizerTest < ActiveSupport::TestCase
|
|
121
140
|
@controller.current_admin = admins(:marketing)
|
122
141
|
|
123
142
|
@controller.expects(:authenticate_admin!).once
|
124
|
-
@controller.authorize(:marketing,
|
143
|
+
@controller.authorize(:marketing, with: :admin)
|
125
144
|
end
|
126
145
|
|
127
146
|
test "authorization failure single role" do
|
128
147
|
assert_raises SimonSays::Authorizer::Denied do
|
129
148
|
@controller.instance_variable_set :@membership, documents(:beta).memberships.first
|
130
149
|
|
131
|
-
@controller.authorize(:delete,
|
150
|
+
@controller.authorize(:delete, with: :membership)
|
132
151
|
end
|
133
152
|
end
|
134
153
|
|
@@ -136,8 +155,17 @@ class AuthorizerTest < ActiveSupport::TestCase
|
|
136
155
|
@controller.instance_variable_set :@membership, documents(:beta).memberships.first
|
137
156
|
|
138
157
|
assert_raises SimonSays::Authorizer::Denied do
|
139
|
-
@controller.authorize([:update, :delete],
|
158
|
+
@controller.authorize([:update, :delete], with: :membership)
|
140
159
|
end
|
141
160
|
end
|
142
|
-
end
|
143
161
|
|
162
|
+
test 'Authorizer.default_find_attribute proc' do
|
163
|
+
with_default_find_attribute ->(resource) { :"#{resource}_id" } do
|
164
|
+
with_params id: clients(:alice).client_id do
|
165
|
+
@controller.find_resource :client
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
assert_equal clients(:alice), @controller[:client]
|
170
|
+
end
|
171
|
+
end
|
data/test/test_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simon_says
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.0.alpha.
|
4
|
+
version: 0.3.0.alpha.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Coyne
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2019-
|
13
|
+
date: 2019-07-12 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -136,6 +136,7 @@ files:
|
|
136
136
|
- test/rails_app/app/assets/images/.keep
|
137
137
|
- test/rails_app/app/assets/javascripts/application.js
|
138
138
|
- test/rails_app/app/assets/stylesheets/application.css
|
139
|
+
- test/rails_app/app/controllers/admin/comm_reports_controller.rb
|
139
140
|
- test/rails_app/app/controllers/admin/reports_controller.rb
|
140
141
|
- test/rails_app/app/controllers/application_controller.rb
|
141
142
|
- test/rails_app/app/controllers/concerns/.keep
|
@@ -147,6 +148,7 @@ files:
|
|
147
148
|
- test/rails_app/app/models/admin.rb
|
148
149
|
- test/rails_app/app/models/admin/report.rb
|
149
150
|
- test/rails_app/app/models/application_record.rb
|
151
|
+
- test/rails_app/app/models/client.rb
|
150
152
|
- test/rails_app/app/models/concerns/.keep
|
151
153
|
- test/rails_app/app/models/document.rb
|
152
154
|
- test/rails_app/app/models/image.rb
|
@@ -182,6 +184,7 @@ files:
|
|
182
184
|
- test/rails_app/db/migrate/20141016183642_create_documents.rb
|
183
185
|
- test/rails_app/db/migrate/20141017140833_create_admin_reports.rb
|
184
186
|
- test/rails_app/db/migrate/20160823220959_create_images.rb
|
187
|
+
- test/rails_app/db/migrate/20190711184853_create_clients.rb
|
185
188
|
- test/rails_app/db/schema.rb
|
186
189
|
- test/rails_app/db/seeds.rb
|
187
190
|
- test/rails_app/lib/assets/.keep
|
@@ -196,6 +199,7 @@ files:
|
|
196
199
|
- test/rails_app/test/fixtures/.keep
|
197
200
|
- test/rails_app/test/fixtures/admin/reports.yml
|
198
201
|
- test/rails_app/test/fixtures/admins.yml
|
202
|
+
- test/rails_app/test/fixtures/clients.yml
|
199
203
|
- test/rails_app/test/fixtures/documents.yml
|
200
204
|
- test/rails_app/test/fixtures/images.yml
|
201
205
|
- test/rails_app/test/fixtures/memberships.yml
|
@@ -205,6 +209,7 @@ files:
|
|
205
209
|
- test/rails_app/test/mailers/.keep
|
206
210
|
- test/rails_app/test/models/.keep
|
207
211
|
- test/rails_app/test/models/admin/report_test.rb
|
212
|
+
- test/rails_app/test/models/client_test.rb
|
208
213
|
- test/rails_app/test/models/document_test.rb
|
209
214
|
- test/rails_app/test/models/image_test.rb
|
210
215
|
- test/rails_app/test/models/membership_test.rb
|
@@ -235,8 +240,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
235
240
|
- !ruby/object:Gem::Version
|
236
241
|
version: 1.3.1
|
237
242
|
requirements: []
|
238
|
-
|
239
|
-
rubygems_version: 2.7.9
|
243
|
+
rubygems_version: 3.0.3
|
240
244
|
signing_key:
|
241
245
|
specification_version: 4
|
242
246
|
summary: Light-weight, declarative authorization and access control for Rails
|
@@ -250,6 +254,7 @@ test_files:
|
|
250
254
|
- test/rails_app/app/assets/images/.keep
|
251
255
|
- test/rails_app/app/assets/javascripts/application.js
|
252
256
|
- test/rails_app/app/assets/stylesheets/application.css
|
257
|
+
- test/rails_app/app/controllers/admin/comm_reports_controller.rb
|
253
258
|
- test/rails_app/app/controllers/admin/reports_controller.rb
|
254
259
|
- test/rails_app/app/controllers/application_controller.rb
|
255
260
|
- test/rails_app/app/controllers/concerns/.keep
|
@@ -261,6 +266,7 @@ test_files:
|
|
261
266
|
- test/rails_app/app/models/admin.rb
|
262
267
|
- test/rails_app/app/models/admin/report.rb
|
263
268
|
- test/rails_app/app/models/application_record.rb
|
269
|
+
- test/rails_app/app/models/client.rb
|
264
270
|
- test/rails_app/app/models/concerns/.keep
|
265
271
|
- test/rails_app/app/models/document.rb
|
266
272
|
- test/rails_app/app/models/image.rb
|
@@ -296,6 +302,7 @@ test_files:
|
|
296
302
|
- test/rails_app/db/migrate/20141016183642_create_documents.rb
|
297
303
|
- test/rails_app/db/migrate/20141017140833_create_admin_reports.rb
|
298
304
|
- test/rails_app/db/migrate/20160823220959_create_images.rb
|
305
|
+
- test/rails_app/db/migrate/20190711184853_create_clients.rb
|
299
306
|
- test/rails_app/db/schema.rb
|
300
307
|
- test/rails_app/db/seeds.rb
|
301
308
|
- test/rails_app/lib/assets/.keep
|
@@ -310,6 +317,7 @@ test_files:
|
|
310
317
|
- test/rails_app/test/fixtures/.keep
|
311
318
|
- test/rails_app/test/fixtures/admin/reports.yml
|
312
319
|
- test/rails_app/test/fixtures/admins.yml
|
320
|
+
- test/rails_app/test/fixtures/clients.yml
|
313
321
|
- test/rails_app/test/fixtures/documents.yml
|
314
322
|
- test/rails_app/test/fixtures/images.yml
|
315
323
|
- test/rails_app/test/fixtures/memberships.yml
|
@@ -319,6 +327,7 @@ test_files:
|
|
319
327
|
- test/rails_app/test/mailers/.keep
|
320
328
|
- test/rails_app/test/models/.keep
|
321
329
|
- test/rails_app/test/models/admin/report_test.rb
|
330
|
+
- test/rails_app/test/models/client_test.rb
|
322
331
|
- test/rails_app/test/models/document_test.rb
|
323
332
|
- test/rails_app/test/models/image_test.rb
|
324
333
|
- test/rails_app/test/models/membership_test.rb
|