stffn-declarative_authorization 0.3.0 → 0.3.1

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.
Files changed (35) hide show
  1. data/CHANGELOG +9 -0
  2. data/README.rdoc +22 -6
  3. data/app/controllers/authorization_rules_controller.rb +135 -14
  4. data/app/helpers/authorization_rules_helper.rb +96 -13
  5. data/app/views/authorization_rules/_change.erb +49 -0
  6. data/app/views/authorization_rules/_show_graph.erb +37 -0
  7. data/app/views/authorization_rules/_suggestion.erb +9 -0
  8. data/app/views/authorization_rules/_suggestions.erb +24 -0
  9. data/app/views/authorization_rules/change.html.erb +124 -0
  10. data/app/views/authorization_rules/graph.dot.erb +23 -4
  11. data/app/views/authorization_rules/graph.html.erb +1 -0
  12. data/app/views/authorization_rules/index.html.erb +3 -2
  13. data/app/views/authorization_usages/index.html.erb +2 -11
  14. data/config/routes.rb +2 -1
  15. data/lib/declarative_authorization/authorization.rb +87 -35
  16. data/lib/declarative_authorization/development_support/analyzer.rb +252 -0
  17. data/lib/declarative_authorization/development_support/change_analyzer.rb +253 -0
  18. data/lib/declarative_authorization/development_support/change_supporter.rb +578 -0
  19. data/lib/declarative_authorization/development_support/development_support.rb +243 -0
  20. data/lib/declarative_authorization/helper.rb +6 -2
  21. data/lib/declarative_authorization/in_controller.rb +254 -26
  22. data/lib/declarative_authorization/in_model.rb +27 -2
  23. data/lib/declarative_authorization/maintenance.rb +22 -8
  24. data/lib/declarative_authorization/obligation_scope.rb +14 -9
  25. data/lib/declarative_authorization/reader.rb +10 -2
  26. data/test/authorization_test.rb +44 -0
  27. data/test/controller_filter_resource_access_test.rb +385 -0
  28. data/test/controller_test.rb +14 -6
  29. data/test/helper_test.rb +21 -0
  30. data/test/maintenance_test.rb +26 -0
  31. data/test/model_test.rb +28 -0
  32. data/test/test_helper.rb +14 -1
  33. metadata +15 -5
  34. data/lib/declarative_authorization/authorization_rules_analyzer.rb +0 -138
  35. data/test/authorization_rules_analyzer_test.rb +0 -123
@@ -5,6 +5,31 @@ require File.dirname(__FILE__) + '/obligation_scope.rb'
5
5
  module Authorization
6
6
 
7
7
  module AuthorizationInModel
8
+
9
+ # If the user meets the given privilege, permitted_to? returns true
10
+ # and yields to the optional block.
11
+ def permitted_to? (privilege, options = {} )
12
+ options = {
13
+ :user => Authorization.current_user,
14
+ :object => self
15
+ }.merge(options)
16
+ Authorization::Engine.instance.permit?(privilege,
17
+ {:user => options[:user],
18
+ :object => options[:object]},
19
+ &block)
20
+ end
21
+
22
+ # Works similar to the permitted_to? method, but doesn't accept a block
23
+ # and throws the authorization exceptions, just like Engine#permit!
24
+ def permitted_to! (privilege, options = {} )
25
+ options = {
26
+ :user => Authorization.current_user,
27
+ :object => self
28
+ }.merge(options)
29
+ Authorization::Engine.instance.permit!(privilege,
30
+ {:user => options[:user],
31
+ :object => options[:object]})
32
+ end
8
33
 
9
34
  def self.included(base) # :nodoc:
10
35
  #base.extend(ClassMethods)
@@ -17,7 +42,7 @@ module Authorization
17
42
 
18
43
  user = options[:user] || Authorization.current_user
19
44
 
20
- engine = Authorization::Engine.instance
45
+ engine = options[:engine] || Authorization::Engine.instance
21
46
  engine.permit!(privileges, :user => user, :skip_attribute_test => true,
22
47
  :context => context)
23
48
 
@@ -33,7 +58,7 @@ module Authorization
33
58
  :model => self,
34
59
  :engine => nil,
35
60
  }.merge(options)
36
- engine ||= Authorization::Engine.instance
61
+ engine = options[:engine] || Authorization::Engine.instance
37
62
 
38
63
  scope = ObligationScope.new( options[:model], {} )
39
64
  engine.obligations( privileges, :user => options[:user], :context => options[:context] ).each do |obligation|
@@ -22,10 +22,7 @@ module Authorization
22
22
  # SomeModel.find(:first).save
23
23
  # end
24
24
  def without_access_control
25
- Authorization.ignore_access_control(true)
26
- yield
27
- ensure
28
- Authorization.ignore_access_control(false)
25
+ self.class.without_access_control
29
26
  end
30
27
 
31
28
  # A class method variant of without_access_control. Thus, one can call
@@ -33,10 +30,13 @@ module Authorization
33
30
  # ...
34
31
  # end
35
32
  def self.without_access_control
36
- Authorization.ignore_access_control(true)
37
- yield
38
- ensure
39
- Authorization.ignore_access_control(false)
33
+ previous_state = Authorization.ignore_access_control
34
+ begin
35
+ Authorization.ignore_access_control(true)
36
+ yield
37
+ ensure
38
+ Authorization.ignore_access_control(previous_state)
39
+ end
40
40
  end
41
41
 
42
42
  # Sets the current user for the declarative authorization plugin to the
@@ -145,6 +145,20 @@ module Authorization
145
145
  end
146
146
  end
147
147
 
148
+ def should_be_allowed_to (privilege, object_or_context)
149
+ options = {}
150
+ options[object_or_context.is_a?(Symbol) ? :context : :object] = object_or_context
151
+ assert_nothing_raised do
152
+ Authorization::Engine.instance.permit!(privilege, options)
153
+ end
154
+ end
155
+
156
+ def should_not_be_allowed_to (privilege, object_or_context)
157
+ options = {}
158
+ options[object_or_context.is_a?(Symbol) ? :context : :object] = object_or_context
159
+ assert !Authorization::Engine.instance.permit?(privilege, options)
160
+ end
161
+
148
162
  def request_with (user, method, xhr, action, params = {},
149
163
  session = {}, flash = {})
150
164
  session = session.merge({:user => user, :user_id => user.id})
@@ -208,15 +208,20 @@ module Authorization
208
208
  end
209
209
  bindvar = "#{attribute_table_alias}__#{attribute_name}_#{obligation_index}".to_sym
210
210
 
211
- attribute_operator = case operator
212
- when :contains, :is then "= :#{bindvar}"
213
- when :does_not_contain, :is_not then "<> :#{bindvar}"
214
- when :is_in, :intersects_with then "IN (:#{bindvar})"
215
- when :is_not_in then "NOT IN (:#{bindvar})"
216
- else raise AuthorizationUsageError, "Unknown operator: #{operator}"
217
- end
218
- obligation_conds << "#{connection.quote_table_name(attribute_table_alias)}.#{connection.quote_table_name(attribute_name)} #{attribute_operator}"
219
- binds[bindvar] = attribute_value(value)
211
+ sql_attribute = "#{connection.quote_table_name(attribute_table_alias)}.#{connection.quote_table_name(attribute_name)}"
212
+ if value.nil? and [:is, :is_not].include?(operator)
213
+ obligation_conds << "#{sql_attribute} IS #{[:contains, :is].include?(operator) ? '' : 'NOT '}NULL"
214
+ else
215
+ attribute_operator = case operator
216
+ when :contains, :is then "= :#{bindvar}"
217
+ when :does_not_contain, :is_not then "<> :#{bindvar}"
218
+ when :is_in, :intersects_with then "IN (:#{bindvar})"
219
+ when :is_not_in then "NOT IN (:#{bindvar})"
220
+ else raise AuthorizationUsageError, "Unknown operator: #{operator}"
221
+ end
222
+ obligation_conds << "#{sql_attribute} #{attribute_operator}"
223
+ binds[bindvar] = attribute_value(value)
224
+ end
220
225
  end
221
226
  end
222
227
  obligation_conds << "1=1" if obligation_conds.empty?
@@ -229,8 +229,10 @@ module Authorization
229
229
  privs = options[:to]
230
230
  privs = [privs] unless privs.is_a?(Array)
231
231
  raise DSLError, "has_permission_on either needs a block or :to option" if !block_given? and privs.empty?
232
-
233
- rule = AuthorizationRule.new(@current_role, privs, context, options[:join_by])
232
+
233
+ file, line = file_and_line_number_from_call_stack
234
+ rule = AuthorizationRule.new(@current_role, privs, context, options[:join_by],
235
+ :source_file => file, :source_line => line)
234
236
  @auth_rules << rule
235
237
  if block_given?
236
238
  @current_rule = rule
@@ -425,6 +427,12 @@ module Authorization
425
427
  end
426
428
  hash.merge!(merge_hash)
427
429
  end
430
+
431
+ def file_and_line_number_from_call_stack
432
+ caller_parts = caller(2).first.split(':')
433
+ [caller_parts[0] == "(eval)" ? nil : caller_parts[0],
434
+ caller_parts[1] && caller_parts[1].to_i]
435
+ end
428
436
  end
429
437
  end
430
438
  end
@@ -191,6 +191,28 @@ class AuthorizationTest < Test::Unit::TestCase
191
191
  engine.obligations(:test, :context => :permission_children_children,
192
192
  :user => MockUser.new(:test_role))
193
193
  end
194
+
195
+ def test_obligations_with_permissions_and_anded_conditions
196
+ reader = Authorization::Reader::DSLReader.new
197
+ reader.parse %{
198
+ authorization do
199
+ role :test_role do
200
+ has_permission_on :permission_children, :to => :test, :join_by => :and do
201
+ if_permitted_to :test, :permission
202
+ if_attribute :test_attr => 1
203
+ end
204
+ has_permission_on :permissions, :to => :test do
205
+ if_attribute :test_attr => 1
206
+ end
207
+ end
208
+ end
209
+ }
210
+ engine = Authorization::Engine.new(reader)
211
+
212
+ assert_equal [{:test_attr => [:is, 1], :permission => {:test_attr => [:is, 1]}}],
213
+ engine.obligations(:test, :context => :permission_children,
214
+ :user => MockUser.new(:test_role))
215
+ end
194
216
 
195
217
  def test_guest_user
196
218
  reader = Authorization::Reader::DSLReader.new
@@ -776,4 +798,26 @@ class AuthorizationTest < Test::Unit::TestCase
776
798
  assert engine.permit?(:test, :context => :permissions)
777
799
  Authorization.current_user = nil
778
800
  end
801
+
802
+ def test_clone
803
+ reader = Authorization::Reader::DSLReader.new
804
+ reader.parse %{
805
+ authorization do
806
+ role :test_role do
807
+ has_permission_on :permissions, :to => :test do
808
+ if_attribute :attr => { :sub_attr => is { user } }
809
+ if_permitted_to :read, :attr_2 => :attr_3
810
+ if_permitted_to :read, :attr_2
811
+ end
812
+ end
813
+ end
814
+ }
815
+
816
+ engine = Authorization::Engine.new(reader)
817
+ cloned_engine = engine.clone
818
+ assert_not_equal engine.auth_rules[0].contexts.object_id,
819
+ cloned_engine.auth_rules[0].contexts.object_id
820
+ assert_not_equal engine.auth_rules[0].attributes[0].send(:instance_variable_get, :@conditions_hash)[:attr].object_id,
821
+ cloned_engine.auth_rules[0].attributes[0].send(:instance_variable_get, :@conditions_hash)[:attr].object_id
822
+ end
779
823
  end
@@ -0,0 +1,385 @@
1
+ require File.join(File.dirname(__FILE__), 'test_helper.rb')
2
+
3
+ class BasicResource < MockDataObject
4
+ end
5
+ class BasicResourcesController < MocksController
6
+ filter_resource_access
7
+ define_resource_actions
8
+ end
9
+ class BasicResourcesControllerTest < ActionController::TestCase
10
+ def test_basic_filter_index
11
+ reader = Authorization::Reader::DSLReader.new
12
+ reader.parse %{
13
+ authorization do
14
+ role :allowed_role do
15
+ has_permission_on :basic_resources, :to => :index do
16
+ if_attribute :id => is {"1"}
17
+ end
18
+ end
19
+ end
20
+ }
21
+
22
+ allowed_user = MockUser.new(:allowed_role)
23
+ request!(MockUser.new(:another_role), :index, reader)
24
+ assert !@controller.authorized?
25
+ request!(allowed_user, :index, reader)
26
+ assert @controller.authorized?
27
+ end
28
+
29
+ def test_basic_filter_show_with_id
30
+ reader = Authorization::Reader::DSLReader.new
31
+ reader.parse %{
32
+ authorization do
33
+ role :allowed_role do
34
+ has_permission_on :basic_resources, :to => :show do
35
+ if_attribute :id => is {"1"}
36
+ end
37
+ end
38
+ end
39
+ }
40
+
41
+ allowed_user = MockUser.new(:allowed_role)
42
+ request!(allowed_user, :show, reader, :id => "2")
43
+ assert !@controller.authorized?
44
+ request!(allowed_user, :show, reader, :id => "1", :clear => [:@basic_resource])
45
+ assert @controller.authorized?
46
+ end
47
+
48
+ def test_basic_filter_new_with_params
49
+ reader = Authorization::Reader::DSLReader.new
50
+ reader.parse %{
51
+ authorization do
52
+ role :allowed_role do
53
+ has_permission_on :basic_resources, :to => :new do
54
+ if_attribute :id => is {"1"}
55
+ end
56
+ end
57
+ end
58
+ }
59
+
60
+ allowed_user = MockUser.new(:allowed_role)
61
+ request!(allowed_user, :new, reader, :basic_resource => {:id => "2"})
62
+ assert !@controller.authorized?
63
+ request!(allowed_user, :new, reader, :basic_resource => {:id => "1"},
64
+ :clear => [:@basic_resource])
65
+ assert @controller.authorized?
66
+ end
67
+ end
68
+
69
+
70
+ class NestedResource < MockDataObject
71
+ def initialize (attributes = {})
72
+ if attributes[:id]
73
+ attributes[:parent_mock] ||= ParentMock.new(:id => attributes[:id])
74
+ end
75
+ super(attributes)
76
+ end
77
+ end
78
+ class ParentMock < MockDataObject
79
+ def nested_resources
80
+ Class.new do
81
+ def initialize (parent_mock)
82
+ @parent_mock = parent_mock
83
+ end
84
+ def new (attributes = {})
85
+ NestedResource.new(attributes.merge(:parent_mock => @parent_mock))
86
+ end
87
+ end.new(self)
88
+ end
89
+
90
+ def == (other)
91
+ id == other.id
92
+ end
93
+ end
94
+ class NestedResourcesController < MocksController
95
+ filter_resource_access :nested_in => :parent_mocks
96
+ define_resource_actions
97
+ end
98
+ class NestedResourcesControllerTest < ActionController::TestCase
99
+ def test_nested_filter_index
100
+ reader = Authorization::Reader::DSLReader.new
101
+ reader.parse %{
102
+ authorization do
103
+ role :allowed_role do
104
+ has_permission_on :nested_resources, :to => :index do
105
+ if_attribute :parent_mock => is {ParentMock.find("1")}
106
+ end
107
+ end
108
+ end
109
+ }
110
+
111
+ allowed_user = MockUser.new(:allowed_role)
112
+ request!(MockUser.new(:another_role), :index, reader, :parent_mock_id => "2")
113
+ assert !@controller.authorized?
114
+ request!(allowed_user, :index, reader, :parent_mock_id => "2",
115
+ :clear => [:@nested_resource, :@parent_mock])
116
+ assert !@controller.authorized?
117
+ request!(allowed_user, :index, reader, :parent_mock_id => "1",
118
+ :clear => [:@nested_resource, :@parent_mock])
119
+ assert @controller.authorized?
120
+ end
121
+
122
+ def test_nested_filter_show_with_id
123
+ reader = Authorization::Reader::DSLReader.new
124
+ reader.parse %{
125
+ authorization do
126
+ role :allowed_role do
127
+ has_permission_on :nested_resources, :to => :show do
128
+ if_attribute :parent_mock => is {ParentMock.find("1")}
129
+ end
130
+ end
131
+ end
132
+ }
133
+
134
+ allowed_user = MockUser.new(:allowed_role)
135
+ request!(allowed_user, :show, reader, :id => "2", :parent_mock_id => "2")
136
+ assert !@controller.authorized?
137
+ request!(allowed_user, :show, reader, :id => "1", :parent_mock_id => "1",
138
+ :clear => [:@nested_resource, :@parent_mock])
139
+ assert @controller.authorized?
140
+ end
141
+
142
+ def test_nested_filter_new_with_params
143
+ reader = Authorization::Reader::DSLReader.new
144
+ reader.parse %{
145
+ authorization do
146
+ role :allowed_role do
147
+ has_permission_on :nested_resources, :to => :new do
148
+ if_attribute :parent_mock => is {ParentMock.find("1")}
149
+ end
150
+ end
151
+ end
152
+ }
153
+
154
+ allowed_user = MockUser.new(:allowed_role)
155
+ request!(allowed_user, :new, reader, :parent_mock_id => "2",
156
+ :nested_resource => {:id => "2"})
157
+ assert !@controller.authorized?
158
+ request!(allowed_user, :new, reader, :parent_mock_id => "1",
159
+ :nested_resource => {:id => "1"},
160
+ :clear => [:@nested_resource, :@parent_mock])
161
+ assert @controller.authorized?
162
+ end
163
+ end
164
+
165
+
166
+ class CustomMembersCollectionsResourceController < MocksController
167
+ def self.controller_name
168
+ "basic_resources"
169
+ end
170
+ filter_resource_access :member => [[:other_show, :read]],
171
+ :collection => {:search => :read}, :new => [:other_new]
172
+ define_action_methods :other_new, :search, :other_show
173
+ end
174
+ class CustomMembersCollectionsResourceControllerTest < ActionController::TestCase
175
+ def test_custom_members_filter_search
176
+ reader = Authorization::Reader::DSLReader.new
177
+ reader.parse %{
178
+ authorization do
179
+ role :allowed_role do
180
+ has_permission_on :basic_resources, :to => :read do
181
+ if_attribute :id => is {"1"}
182
+ end
183
+ end
184
+ end
185
+ }
186
+
187
+ request!(MockUser.new(:another_role), :search, reader)
188
+ assert !@controller.authorized?
189
+ request!(MockUser.new(:allowed_role), :search, reader)
190
+ assert @controller.authorized?
191
+ end
192
+
193
+ def test_custom_members_filter_other_show
194
+ reader = Authorization::Reader::DSLReader.new
195
+ reader.parse %{
196
+ authorization do
197
+ role :allowed_role do
198
+ has_permission_on :basic_resources, :to => :read do
199
+ if_attribute :id => is {"1"}
200
+ end
201
+ end
202
+ end
203
+ }
204
+
205
+ allowed_user = MockUser.new(:allowed_role)
206
+ request!(allowed_user, :other_show, reader, :id => "2")
207
+ assert !@controller.authorized?
208
+ request!(allowed_user, :other_show, reader, :id => "1", :clear => [:@basic_resource])
209
+ assert @controller.authorized?
210
+ end
211
+
212
+ def test_custom_members_filter_other_new
213
+ reader = Authorization::Reader::DSLReader.new
214
+ reader.parse %{
215
+ authorization do
216
+ role :allowed_role do
217
+ has_permission_on :basic_resources, :to => :other_new do
218
+ if_attribute :id => is {"1"}
219
+ end
220
+ end
221
+ end
222
+ }
223
+
224
+ allowed_user = MockUser.new(:allowed_role)
225
+ request!(allowed_user, :other_new, reader, :basic_resource => {:id => "2"})
226
+ assert !@controller.authorized?
227
+ request!(allowed_user, :other_new, reader, :basic_resource => {:id => "1"},
228
+ :clear => [:@basic_resource])
229
+ assert @controller.authorized?
230
+ end
231
+ end
232
+
233
+
234
+ class AdditionalMembersCollectionsResourceController < MocksController
235
+ def self.controller_name
236
+ "basic_resources"
237
+ end
238
+ filter_resource_access :additional_member => :other_show,
239
+ :additional_collection => [:search], :additional_new => {:other_new => :new}
240
+ define_resource_actions
241
+ define_action_methods :other_new, :search, :other_show
242
+ end
243
+ class AdditionalMembersCollectionsResourceControllerTest < ActionController::TestCase
244
+ def test_additional_members_filter_search_index
245
+ reader = Authorization::Reader::DSLReader.new
246
+ reader.parse %{
247
+ authorization do
248
+ role :allowed_role do
249
+ has_permission_on :basic_resources, :to => [:search, :index] do
250
+ if_attribute :id => is {"1"}
251
+ end
252
+ end
253
+ end
254
+ }
255
+
256
+ request!(MockUser.new(:another_role), :search, reader)
257
+ assert !@controller.authorized?
258
+ request!(MockUser.new(:another_role), :index, reader)
259
+ assert !@controller.authorized?
260
+ request!(MockUser.new(:allowed_role), :search, reader)
261
+ assert @controller.authorized?
262
+ request!(MockUser.new(:allowed_role), :index, reader)
263
+ assert @controller.authorized?
264
+ end
265
+
266
+ def test_additional_members_filter_other_show
267
+ reader = Authorization::Reader::DSLReader.new
268
+ reader.parse %{
269
+ authorization do
270
+ role :allowed_role do
271
+ has_permission_on :basic_resources, :to => [:show, :other_show] do
272
+ if_attribute :id => is {"1"}
273
+ end
274
+ end
275
+ end
276
+ }
277
+
278
+ allowed_user = MockUser.new(:allowed_role)
279
+ request!(allowed_user, :other_show, reader, :id => "2")
280
+ assert !@controller.authorized?
281
+ request!(allowed_user, :show, reader, :id => "2", :clear => [:@basic_resource])
282
+ assert !@controller.authorized?
283
+ request!(allowed_user, :other_show, reader, :id => "1", :clear => [:@basic_resource])
284
+ assert @controller.authorized?
285
+ request!(allowed_user, :show, reader, :id => "1", :clear => [:@basic_resource])
286
+ assert @controller.authorized?
287
+ end
288
+
289
+ def test_additional_members_filter_other_new
290
+ reader = Authorization::Reader::DSLReader.new
291
+ reader.parse %{
292
+ authorization do
293
+ role :allowed_role do
294
+ has_permission_on :basic_resources, :to => :new do
295
+ if_attribute :id => is {"1"}
296
+ end
297
+ end
298
+ end
299
+ }
300
+
301
+ allowed_user = MockUser.new(:allowed_role)
302
+ request!(allowed_user, :other_new, reader, :basic_resource => {:id => "2"})
303
+ assert !@controller.authorized?
304
+ request!(allowed_user, :new, reader, :basic_resource => {:id => "2"},
305
+ :clear => [:@basic_resource])
306
+ assert !@controller.authorized?
307
+
308
+ request!(allowed_user, :other_new, reader, :basic_resource => {:id => "1"},
309
+ :clear => [:@basic_resource])
310
+ assert @controller.authorized?
311
+ request!(allowed_user, :new, reader, :basic_resource => {:id => "1"},
312
+ :clear => [:@basic_resource])
313
+ assert @controller.authorized?
314
+ end
315
+ end
316
+
317
+
318
+ class CustomMethodsResourceController < MocksController
319
+ # not implemented yet
320
+ end
321
+
322
+
323
+ class ExplicitContextResourceController < MocksController
324
+ filter_resource_access :context => :basic_resources
325
+ define_resource_actions
326
+ end
327
+ class ExplicitContextResourceControllerTest < ActionController::TestCase
328
+ def test_explicit_context_filter_index
329
+ reader = Authorization::Reader::DSLReader.new
330
+ reader.parse %{
331
+ authorization do
332
+ role :allowed_role do
333
+ has_permission_on :basic_resources, :to => :index do
334
+ if_attribute :id => is {"1"}
335
+ end
336
+ end
337
+ end
338
+ }
339
+
340
+ allowed_user = MockUser.new(:allowed_role)
341
+ request!(MockUser.new(:another_role), :index, reader)
342
+ assert !@controller.authorized?
343
+ request!(allowed_user, :index, reader)
344
+ assert @controller.authorized?
345
+ end
346
+
347
+ def test_explicit_context_filter_show_with_id
348
+ reader = Authorization::Reader::DSLReader.new
349
+ reader.parse %{
350
+ authorization do
351
+ role :allowed_role do
352
+ has_permission_on :basic_resources, :to => :show do
353
+ if_attribute :id => is {"1"}
354
+ end
355
+ end
356
+ end
357
+ }
358
+
359
+ allowed_user = MockUser.new(:allowed_role)
360
+ request!(allowed_user, :show, reader, :id => "2")
361
+ assert !@controller.authorized?
362
+ request!(allowed_user, :show, reader, :id => "1", :clear => [:@basic_resource])
363
+ assert @controller.authorized?
364
+ end
365
+
366
+ def test_explicit_context_filter_new_with_params
367
+ reader = Authorization::Reader::DSLReader.new
368
+ reader.parse %{
369
+ authorization do
370
+ role :allowed_role do
371
+ has_permission_on :basic_resources, :to => :new do
372
+ if_attribute :id => is {"1"}
373
+ end
374
+ end
375
+ end
376
+ }
377
+
378
+ allowed_user = MockUser.new(:allowed_role)
379
+ request!(allowed_user, :new, reader, :basic_resource => {:id => "2"})
380
+ assert !@controller.authorized?
381
+ request!(allowed_user, :new, reader, :basic_resource => {:id => "1"},
382
+ :clear => [:@basic_resource])
383
+ assert @controller.authorized?
384
+ end
385
+ end