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 +4 -4
- data/CHANGELOG.md +9 -1
- data/README.md +16 -1
- data/access-granted.gemspec +1 -1
- data/lib/access-granted/exceptions.rb +3 -2
- data/lib/access-granted/policy.rb +2 -4
- data/lib/access-granted/railtie.rb +17 -7
- data/lib/access-granted/role.rb +2 -5
- data/spec/policy_spec.rb +22 -3
- metadata +3 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 115b6ed416c4bfa4b6d94d53520388c382b65966aa8ce7c4072d9991a630d1d3
|
4
|
+
data.tar.gz: 0af1baa07da37953f292b4bb8d24680cbebdf70c1495203d7a4312d4735584bb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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 #
|
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
|
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.
|
data/access-granted.gemspec
CHANGED
@@ -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.
|
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
|
7
|
-
|
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
|
-
|
13
|
-
|
14
|
-
|
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
|
data/lib/access-granted/role.rb
CHANGED
@@ -69,11 +69,8 @@ module AccessGranted
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def prepare_actions(action)
|
72
|
-
|
73
|
-
|
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 "#
|
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
|
-
|
211
|
+
context "user matches all roles" do
|
201
212
|
it "returns all matching roles in the order of priority" do
|
202
|
-
expect(
|
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.
|
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:
|
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
|
-
|
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
|