access-granted 1.3.1 → 1.3.3

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
  SHA256:
3
- metadata.gz: 7691e3b04d61e828a960869add4c89b2fcbbb0ff61449ae9a722f1170c776775
4
- data.tar.gz: 3d802b85887e1e23027819cf14b2bd4ebb9d9bc4aef62f294bd8dedc1dc98457
3
+ metadata.gz: 115b6ed416c4bfa4b6d94d53520388c382b65966aa8ce7c4072d9991a630d1d3
4
+ data.tar.gz: 0af1baa07da37953f292b4bb8d24680cbebdf70c1495203d7a4312d4735584bb
5
5
  SHA512:
6
- metadata.gz: 929211bc395469276092ed2303d5d4bf117161e9df3602cfea3d4caf67ea29516fca0473eb24e8e5326921d042ab8d534eef7a27e9ccdd727b29fd129f7cc622
7
- data.tar.gz: d60b8f9c3824c28952daf0a84ee4bd534ec44cc7ef6f183949eb83538b015b2a80b155ee8f91ba6484d620041c2143a4ca9ce7d46c7ef71280b56f25d744821d
6
+ metadata.gz: 6554c68a9ddd5f04866afef389d59d48ddbd63fc6173c6955b39075fb9f23ac5c8d1036f13cc8f7ac9fed997217d1d69b725c5f6e0dc83550a1e8eea293e6e6d
7
+ data.tar.gz: 162efc4e19ad3fa554778b00dfd46d28f951ac90a65d94c2f3037f554dc590f9822eb7db6a19c792f65eeaba78adcc77386f9956e88c7f00f9127a2a231141e9
data/CHANGELOG.md CHANGED
@@ -1,6 +1,14 @@
1
+ # 1.3.3
2
+
3
+ - Fix compatibility with Rails 6.0 and Zeitwerk ([PR #53](https://github.com/chaps-io/access-granted/pull/53)), thanks [jraqula](https://github.com/dmorehouse)!
4
+
5
+ # 1.3.2
6
+
7
+ - Expose `applicable_roles` method on the policy instance. This allows insight into what roles actually apply to a given user.
8
+
1
9
  # 1.3.1
2
10
 
3
- - Add information about action and subject when raising AccessDenied exception ([PR #45](https://github.com/chaps-io/access-granted/pull/46)), thanks [jraqula](https://github.com/jraqula)!
11
+ - Add information about action and subject when raising AccessDenied exception ([PR #46](https://github.com/chaps-io/access-granted/pull/46)), thanks [jraqula](https://github.com/jraqula)!
4
12
 
5
13
  # 1.3.0
6
14
 
data/README.md CHANGED
@@ -25,7 +25,7 @@ config.autoload_paths += %W(#{config.root}/app/policies #{config.root}/app/roles
25
25
 
26
26
  ### Supported Ruby versions
27
27
 
28
- Because it has **zero** runtime dependencies it is guaranteed to work on all major Ruby versions MRI 1.9.3-2.2, Rubinius >= 2.X and JRuby >= 1.7.
28
+ Because it has **zero** runtime dependencies it is guaranteed to work on all major Ruby versions MRI `2.0` - `2.5`, Rubinius `>= 2.X` and JRuby `>= 1.7`.
29
29
 
30
30
  ## Summary
31
31
 
@@ -232,6 +232,21 @@ if you want to handle authorization errors differently for some cases:
232
232
  end
233
233
  ```
234
234
 
235
+ You can also have a custom exception message while authorizing a request.
236
+ This message will be associated with the exception object thrown.
237
+
238
+ ```ruby
239
+ class PostsController
240
+ def show
241
+ @post = Post.find(params[:id])
242
+ authorize! :read, @post, 'You do not have access to this post'
243
+ render json: { post: @post }
244
+ rescue AccessGranted::AccessDenied => e
245
+ render json: { error: e.message }, status: :forbidden
246
+ end
247
+ end
248
+ ```
249
+
235
250
  #### Checking permissions in controllers
236
251
 
237
252
  To check if the user has a permission to perform an action, use the `can?` and `cannot?` methods.
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "access-granted"
7
- spec.version = "1.3.1"
7
+ spec.version = "1.3.3"
8
8
  spec.authors = ["Piotrek Okoński"]
9
9
  spec.email = ["piotrek@okonski.org"]
10
10
  spec.description = %q{Role based authorization gem}
@@ -4,10 +4,11 @@ module AccessGranted
4
4
  class DuplicatePermission < Error; end;
5
5
  class DuplicateRole < Error; end;
6
6
  class AccessDenied < Error
7
- attr_reader :action, :subject
8
- def initialize(action = nil, subject = nil)
7
+ attr_reader :action, :subject, :message
8
+ def initialize(action = nil, subject = nil, message = nil)
9
9
  @action = action
10
10
  @subject = subject
11
+ @message = message
11
12
  end
12
13
  end
13
14
  end
@@ -56,15 +56,13 @@ module AccessGranted
56
56
  !can?(*args)
57
57
  end
58
58
 
59
- def authorize!(action, subject)
59
+ def authorize!(action, subject, message = 'Access Denied')
60
60
  if cannot?(action, subject)
61
- raise AccessDenied.new(action, subject)
61
+ raise AccessDenied.new(action, subject, message)
62
62
  end
63
63
  subject
64
64
  end
65
65
 
66
- private
67
-
68
66
  def applicable_roles
69
67
  @applicable_roles ||= roles.select do |role|
70
68
  role.applies_to?(user)
@@ -3,15 +3,25 @@ require 'rails/railtie'
3
3
  module AccessGranted
4
4
  class Railtie < ::Rails::Railtie
5
5
  initializer :access_granted do
6
- if defined? ActionController::Base
7
- ActionController::Base.class_eval do
8
- include AccessGranted::Rails::ControllerMethods
6
+ if ::Rails::VERSION::MAJOR >= 6
7
+ ActiveSupport.on_load(:action_controller_base) do |base|
8
+ base.include AccessGranted::Rails::ControllerMethods
9
+ end
10
+
11
+ ActiveSupport.on_load(:action_controller_api) do |base|
12
+ base.include AccessGranted::Rails::ControllerMethods
13
+ end
14
+ else
15
+ if defined? ActionController::Base
16
+ ActionController::Base.class_eval do
17
+ include AccessGranted::Rails::ControllerMethods
18
+ end
9
19
  end
10
- end
11
20
 
12
- if defined? ActionController::API
13
- ActionController::API.class_eval do
14
- include AccessGranted::Rails::ControllerMethods
21
+ if defined? ActionController::API
22
+ ActionController::API.class_eval do
23
+ include AccessGranted::Rails::ControllerMethods
24
+ end
15
25
  end
16
26
  end
17
27
  end
@@ -69,11 +69,8 @@ module AccessGranted
69
69
  end
70
70
 
71
71
  def prepare_actions(action)
72
- if action == :manage
73
- actions = [:read, :create, :update, :destroy]
74
- else
75
- actions = Array(*[action])
76
- end
72
+ actions = Array(*[action])
73
+ actions.flat_map { |a| a == :manage ? [:create, :read, :update, :destroy ] : [a] }
77
74
  end
78
75
  end
79
76
  end
data/spec/policy_spec.rb CHANGED
@@ -143,6 +143,16 @@ describe AccessGranted::Policy do
143
143
  end
144
144
  end
145
145
 
146
+ it "raises AccessDenied with supplied message if action is not allowed" do
147
+ message = 'You are not allowed to create Integer'
148
+ expect { klass.new(@member).authorize!(:create, Integer, message) }.to raise_error do |err|
149
+ expect(err).to be_a(AccessGranted::AccessDenied)
150
+ expect(err.action).to eq(:create)
151
+ expect(err.subject).to eq(Integer)
152
+ expect(err.message).to eq(message)
153
+ end
154
+ end
155
+
146
156
  it "returns the subject if allowed" do
147
157
  expect(klass.new(@member).authorize!(:create, String)).to equal String
148
158
  end
@@ -188,8 +198,9 @@ describe AccessGranted::Policy do
188
198
  end
189
199
  end
190
200
 
191
- describe "#matching_roles" do
201
+ describe "#applicable_roles" do
192
202
  let(:user) { double("User", is_moderator: true, is_admin: true) }
203
+ subject(:policy) { klass.new(user) }
193
204
 
194
205
  before do
195
206
  policy.role(:administrator, { is_admin: true })
@@ -197,9 +208,17 @@ describe AccessGranted::Policy do
197
208
  policy.role(:member)
198
209
  end
199
210
 
200
- shared_examples 'role matcher' do
211
+ context "user matches all roles" do
201
212
  it "returns all matching roles in the order of priority" do
202
- expect(subject.map(&:name)).to eq([:administrator, :moderator, :member])
213
+ expect(policy.applicable_roles.map(&:name)).to eq([:administrator, :moderator, :member])
214
+ end
215
+ end
216
+
217
+ context "user is just an admin" do
218
+ let(:user) { double("User", is_moderator: false, is_admin: true) }
219
+
220
+ it 'returns array with admin and member roles' do
221
+ expect(policy.applicable_roles.map(&:name)).to eq([:administrator, :member])
203
222
  end
204
223
  end
205
224
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: access-granted
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.1
4
+ version: 1.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotrek Okoński
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-28 00:00:00.000000000 Z
11
+ date: 2021-08-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -90,8 +90,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
90
90
  - !ruby/object:Gem::Version
91
91
  version: '0'
92
92
  requirements: []
93
- rubyforge_project:
94
- rubygems_version: 2.7.6
93
+ rubygems_version: 3.1.4
95
94
  signing_key:
96
95
  specification_version: 4
97
96
  summary: Elegant whitelist and role based authorization with ability to prioritize