authority 2.8.1 → 2.9.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 78956bd3adcf1276d5e54a6ed16dcf58efadfc42
4
- data.tar.gz: e5dabb9b9806e790713e9f73e903ba1453fc2490
3
+ metadata.gz: 49f7f09d33ece9e1d0f128c629d5963fbcf55c5b
4
+ data.tar.gz: 7978825534fc7412ed65cba9a531b0733d331100
5
5
  SHA512:
6
- metadata.gz: fd3b8f16795dbceaa0b6282a038e6df139c3ca7a5abde3ff37f7decd23910405a96c9bbfce84081840dd8e6e18577f10b758541fc5a82c9c3c6a79ad8f1559a2
7
- data.tar.gz: 64ffd79650035946a337270a17ba1abb4cae2e3b7f266d0bd716d1e2e0d8c8df67b871c1cbb6f69868a82d325fcc5e69bbed5c38539b4410d8ef6ca57c9027b2
6
+ metadata.gz: dd93e0ddda2bec80acf414af069344af29ee3ee287b1143d9bd7fff623bbf3bcdee6d2ca582665c8f9e60ccbbf4c6a3e223fb0414d4ec99bd840543864455ea0
7
+ data.tar.gz: a499cccc078b3777bf4543266976eb0d1df26951fca5a4419b7c7b813a1bbcae279b7ac4c0a03c03b3c54f4230fcb67d8c0d163deb16e9162579adeef39cab20
data/CHANGELOG.markdown CHANGED
@@ -2,9 +2,13 @@
2
2
 
3
3
  Authority does its best to use [semantic versioning](http://semver.org).
4
4
 
5
+ ## v2.9.0
6
+
7
+ Add `all_actions` option for `authorize_actions_for`, thanks to [Igor Davydov](https://github.com/div).
8
+
5
9
  ## v2.8.1
6
10
 
7
- Add license to gemspec, thanks to notice from Benjamin Fleischer - see [his blog post](http://www.benjaminfleischer.com/2013/07/12/make-the-world-a-better-place-put-a-license-in-your-gemspec/)
11
+ Add license to gemspec, thanks to notice from [Benjamin Fleischer](https://github.com/bf4) - see [his blog post](http://www.benjaminfleischer.com/2013/07/12/make-the-world-a-better-place-put-a-license-in-your-gemspec/)
8
12
 
9
13
  ## v2.8.0
10
14
 
@@ -12,12 +16,12 @@ New controller method `ensure_authorization_performed`, thanks to [Igor Davydov]
12
16
 
13
17
  ## 2.7.0
14
18
 
15
- Allows setting authorizer by class (`authorizer = FooAuthorizer`) as well as by name (`authorizer_name = 'FooAuthorizer'`), thanks to [mguymon](https://github.com/mguymon)
19
+ Allows setting authorizer by class (`authorizer = FooAuthorizer`) as well as by name (`authorizer_name = 'FooAuthorizer'`), thanks to [Michael Guymon](https://github.com/mguymon)
16
20
 
17
21
  ## v2.6.0
18
22
 
19
- - Now dependent on ActiveSupport, not all of Rails, as a step toward easier use with other frameworks. Thanks to [christhekeele](https://github.com/christhekeele)
20
- - Testing with Rails 4.0, thanks to [sanemat](https://github.com/sanemat)
23
+ - Now dependent on ActiveSupport, not all of Rails, as a step toward easier use with other frameworks. Thanks to [Christopher Keele](https://github.com/christhekeele)
24
+ - Testing with Rails 4.0, thanks to [Murahashi Sanemat Kenichi](https://github.com/sanemat)
21
25
  - Clearer backtraces in certain situations
22
26
 
23
27
  ## v2.5.0
@@ -56,7 +60,7 @@ Controller method `authorize_actions_for` can now be given a method name to dyna
56
60
 
57
61
  ## v2.2.0
58
62
 
59
- Allow passing options hash to `authorize_action_for`, like `authorize_action_for(@llama, :sporting => @hat_style)`. Thanks to [MP211](https://github.com/MP211).
63
+ Allow passing options hash to `authorize_action_for`, like `authorize_action_for(@llama, :sporting => @hat_style)`. Thanks to [Mike Paulo](https://github.com/MP211).
60
64
 
61
65
  ## v2.1.0
62
66
 
@@ -73,7 +77,7 @@ Documentation and test cleanup.
73
77
 
74
78
  ## v1.1.0
75
79
 
76
- - Added `Authority::Authorizer.default` class method which is called before the `default_strategy` proc and delegates to that proc. This can be overridden per authorizer. Thanks to [kevmoo](https://github.com/kevmoo)
80
+ - Added `Authority::Authorizer.default` class method which is called before the `default_strategy` proc and delegates to that proc. This can be overridden per authorizer. Thanks to [Kevin Moore](https://github.com/kevmoo)
77
81
 
78
82
  ## v1.0.0
79
83
 
data/README.markdown CHANGED
@@ -397,6 +397,18 @@ class LlamasController < ApplicationController
397
397
  end
398
398
  ```
399
399
 
400
+ If you want to authorize all actions the same way, use the special `all_actions` hash key. For instance, if you have nested resources, you might say "you're allowed to do anything you like with an employee if you're allowed to update their organization".
401
+
402
+ ```ruby
403
+ class EmployeesController < ApplicationController
404
+ authorize_actions_for :parent_resource, all_actions: :update
405
+ private
406
+ def parent_resource
407
+ Employer.find(params[:employer_id])
408
+ end
409
+ end
410
+ ```
411
+
400
412
  Finally, you can enforce that every controller action runs an authorization check using the class method `ensure_authorization_performed`, which sets up an `after_filter` to raise an exception if it wasn't. Any `only` or `except` arguments will be passed to `after_filter`. You can also use `if` or `unless` to specify the name of a controller method which determines whether it's necessary.
401
413
 
402
414
  Since this runs in an `after_filter`, it obviously doesn't prevent the action, it just alerts you that no authorization was performed. Therefore, it's most useful in development. An example usage might be:
@@ -43,7 +43,7 @@ module Authority
43
43
  # ones and any other options applicable to a before_filter
44
44
  def authorize_actions_for(resource_or_finder, options = {})
45
45
  self.authority_resource = resource_or_finder
46
- authority_actions(options[:actions] || {})
46
+ authority_actions(overridden_actions(options))
47
47
  before_filter :run_authorization_check, options
48
48
  end
49
49
 
@@ -51,6 +51,7 @@ module Authority
51
51
  #
52
52
  # @param [Hash] action_map - controller actions and methods, to be merged with existing action_map
53
53
  def authority_actions(action_map)
54
+ authority_action_map.merge!(overridden_actions(action_map))
54
55
  authority_action_map.merge!(action_map.symbolize_keys)
55
56
  end
56
57
 
@@ -77,6 +78,13 @@ module Authority
77
78
  @authority_action_map ||= Authority.configuration.controller_action_map.dup
78
79
  end
79
80
 
81
+ def overridden_actions(options = {})
82
+ if forced_action = options.fetch(:all_actions, false)
83
+ overridden_actions = authority_action_map.inject({}) { |hash, (key, val)| hash.tap { |h| h[key] = forced_action } }
84
+ end
85
+ overridden_actions || options.fetch(:actions, {})
86
+ end
87
+
80
88
  end
81
89
 
82
90
  protected
@@ -118,7 +126,7 @@ module Authority
118
126
  def instance_authority_resource
119
127
  return self.class.authority_resource if self.class.authority_resource.is_a?(Class)
120
128
  send(self.class.authority_resource)
121
- rescue NoMethodError => e
129
+ rescue NoMethodError
122
130
  raise MissingResource.new(
123
131
  "Trying to authorize actions for '#{self.class.authority_resource}', but can't. \
124
132
  Must be either a resource class OR the name of a controller instance method that \
@@ -1,3 +1,3 @@
1
1
  module Authority
2
- VERSION = "2.8.1"
2
+ VERSION = "2.9.0"
3
3
  end
@@ -2,6 +2,7 @@ require 'spec_helper'
2
2
  require 'support/example_classes'
3
3
  require 'support/mock_rails'
4
4
  require 'active_support/core_ext/proc'
5
+ require 'set'
5
6
 
6
7
  describe Authority::Controller do
7
8
 
@@ -87,6 +88,8 @@ describe Authority::Controller do
87
88
 
88
89
  describe "authorize_actions_for" do
89
90
 
91
+ let(:child_controller) { Class.new(controller_class) }
92
+
90
93
  it "allows specifying the class of the model to protect" do
91
94
  controller_class.authorize_actions_for(resource_class)
92
95
  expect(controller_class.authority_resource).to eq(resource_class)
@@ -103,8 +106,14 @@ describe Authority::Controller do
103
106
  controller_class.authorize_actions_for(resource_class, filter_options)
104
107
  end
105
108
 
106
- it "passes the action hash to the `authority_action` method" do
107
- child_controller = Class.new(controller_class)
109
+ it "if :all_actions option is given, it overrides the action hash to use the action given" do
110
+ overridden_action_map = controller_class.authority_action_map
111
+ overridden_action_map.update(overridden_action_map) {|k,v| v = :annihilate}
112
+ child_controller.should_receive(:authority_actions).with(overridden_action_map)
113
+ child_controller.authorize_actions_for(resource_class, :all_actions => :annihilate)
114
+ end
115
+
116
+ it "passes the action hash to the `authority_actions` method" do
108
117
  new_actions = {:synthesize => :create, :annihilate => 'delete'}
109
118
  child_controller.should_receive(:authority_actions).with(new_actions)
110
119
  child_controller.authorize_actions_for(resource_class, :actions => new_actions)
@@ -137,7 +146,7 @@ describe Authority::Controller do
137
146
 
138
147
  end
139
148
 
140
- describe "authority_action" do
149
+ describe "authority_actions" do
141
150
 
142
151
  it "modifies this controller's authority action map" do
143
152
  new_actions = {:show => :display, :synthesize => :create, :annihilate => 'delete'}
@@ -147,6 +156,20 @@ describe Authority::Controller do
147
156
  )
148
157
  end
149
158
 
159
+ it "forces to use a single method when :all_actions option is given" do
160
+ force_actions = {:all_actions => :utilize}
161
+ controller_class.authority_actions(force_actions)
162
+ expect(controller_class.authority_action_map.values.uniq).to eq([:utilize])
163
+ end
164
+
165
+ it "can be used multiple times; each usage appends methods to authority_action_map" do
166
+ controller_class.authority_actions({:all_actions => :utilize})
167
+ controller_class.authority_actions({:synthesize => :create})
168
+ controller_class.authority_actions({:transmogrify => :update})
169
+ expect(controller_class.authority_action_map.values.uniq.to_set).to eq([:create, :update, :utilize].to_set)
170
+ expect(controller_class.authority_action_map[:synthesize]).to eq(:create)
171
+ end
172
+
150
173
  it "does not modify any other controller" do
151
174
  child_controller = Class.new(controller_class)
152
175
  child_controller.authority_actions(:smite => 'delete')
@@ -155,6 +178,25 @@ describe Authority::Controller do
155
178
 
156
179
  end
157
180
 
181
+ describe "overridden_actions" do
182
+
183
+ it "overrides authority action map if option :all_actions is present" do
184
+ options = { :all_actions => :display, :actions => {:show => :display, :synthesize => :create} }
185
+ expect(controller_class.overridden_actions(options).values.uniq).to eq([:display])
186
+ end
187
+
188
+ it "returns :actions hash if option :all_actions is not present" do
189
+ options = { :actions => {:show => :display, :synthesize => :create, :annihilate => 'delete'} }
190
+ expect(controller_class.overridden_actions(options)).to eq(options[:actions])
191
+ end
192
+
193
+ it "returns an empty hash if no :all_actions nor :actions options present" do
194
+ options = { :show => :display, :synthesize => :create, :annihilate => 'delete' }
195
+ expect(controller_class.overridden_actions(options)).to eq({})
196
+ end
197
+
198
+ end
199
+
158
200
  describe "ensure_authorization_performed" do
159
201
 
160
202
  let(:controller_instance) { controller_class.new }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: authority
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.1
4
+ version: 2.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Long
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-09-30 00:00:00.000000000 Z
12
+ date: 2013-10-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport