action_policy-graphiti 0.0.1 → 0.1.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 +4 -4
- data/CHANGELOG.md +4 -0
- data/README.md +19 -5
- data/lib/action_policy/graphiti/behaviour.rb +24 -12
- data/lib/action_policy/graphiti/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b5fda608ae008fec873744642e5ccadf99e72077910cfb3fb848ed05eceb425
|
4
|
+
data.tar.gz: f77d094525fe60663701cb6df57b8e7a74a64ad0e2316bc18cc7a5fba511bb6d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 15d75dac6c2dc71a20e70783668395fc99480c32b5c95c65fbe29637fdb3a36d71dc62ef2f18e675854dfa70ecb02f56bd5d0e327f4f3f34fa413683351f6bbc
|
7
|
+
data.tar.gz: 0234f15a2aea33a1464a1d5dd5b9b9ec330775ff63af4357dc62408b0ab3d8ecc73d0768946799afc94c4570e9e518e6f33fe71a60ac8c0b90c6ddb260963f5d
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -7,12 +7,10 @@ The following features are currently enabled:
|
|
7
7
|
- Authorization of `create`, `update` and `destroy` actions
|
8
8
|
- Resource scoping
|
9
9
|
|
10
|
-
**This gem is under heavy development
|
10
|
+
**This gem is under heavy development so use it at your own risk!**
|
11
11
|
|
12
12
|
## Installation
|
13
13
|
|
14
|
-
**This gem was not yet released and can be installed only via a github link**
|
15
|
-
|
16
14
|
Add this line to your application's Gemfile:
|
17
15
|
|
18
16
|
```ruby
|
@@ -40,14 +38,30 @@ class TestResource < ApplicationResource
|
|
40
38
|
authorize_action :destroy
|
41
39
|
end
|
42
40
|
```
|
41
|
+
|
42
|
+
Or certain action shortcuts may be used (pay attention to explicit policies and actions):
|
43
|
+
|
44
|
+
```ruby
|
45
|
+
class TestResource < ApplicationResource
|
46
|
+
include ActionPolicy::Graphiti::Behaviour
|
47
|
+
|
48
|
+
authorize_create to: :manage_but_not_destroy?
|
49
|
+
authorize_update with: 'TestExplicitPolicy', to: :manage_but_not_destroy?
|
50
|
+
authorize_destroy
|
51
|
+
end
|
52
|
+
```
|
53
|
+
|
54
|
+
**Note:** current implementation requires you to use policy names (when specifying explicit policies) instead of classes since it is not guaranteed that policy classes are already loaded **before** the resource classes load.
|
55
|
+
|
43
56
|
**Note:** current implementation requires you to place `authorize_` directives **after** `before_save` and `before_destroy` hooks (since it is adding authorization checks as hooks and we want them to be called **after** all the regular hooks were completed).
|
44
57
|
|
45
|
-
Scoping is done via adding the following class method call:
|
58
|
+
Scoping is done via adding the following class method call (you can specify the explicit policy using `with` argument):
|
46
59
|
```ruby
|
47
60
|
class TestResource < ApplicationResource
|
48
61
|
include ActionPolicy::Graphiti::Behaviour
|
49
62
|
|
50
|
-
authorize_scope
|
63
|
+
authorize_scope with: 'TestExplicitPolicy'
|
64
|
+
# or just plain authorize_scope
|
51
65
|
end
|
52
66
|
```
|
53
67
|
**Note:** current implementation requires you to place `authorize_scope` call **after** the explicit `base_scope` method (scoping is performed by base scope results modification).
|
@@ -12,17 +12,23 @@ module ActionPolicy
|
|
12
12
|
AUTHORIZABLE_ACTIONS = %i[create update destroy].freeze
|
13
13
|
IMPLICITLY_AUTHORIZABLE_ACTIONS = %i[index show].freeze
|
14
14
|
|
15
|
-
def authorize_action(action, **arguments)
|
15
|
+
def authorize_action(action, to: nil, with: nil, **arguments)
|
16
16
|
if AUTHORIZABLE_ACTIONS.include?(action)
|
17
|
-
rule = "#{action}?".to_sym
|
18
|
-
|
19
17
|
callback_and_arguments = callback_and_arguments_for_action(action)
|
20
18
|
|
21
19
|
callback = callback_and_arguments[:callback]
|
22
20
|
callback_arguments = callback_and_arguments[:arguments]
|
23
21
|
|
24
22
|
send(callback, **callback_arguments) do |model|
|
25
|
-
|
23
|
+
rule = to || "#{action}?".to_sym
|
24
|
+
|
25
|
+
policy = if with
|
26
|
+
with.is_a?(String) ? ActiveSupport::Inflector.safe_constantize(with) : with
|
27
|
+
else
|
28
|
+
ActionPolicy.lookup(self)
|
29
|
+
end
|
30
|
+
|
31
|
+
authorize! model, with: policy, to: rule, **arguments
|
26
32
|
end
|
27
33
|
elsif IMPLICITLY_AUTHORIZABLE_ACTIONS.include?(action)
|
28
34
|
raise ArgumentError, "Index and show authorization is done implicitly by scoping"
|
@@ -46,25 +52,31 @@ module ActionPolicy
|
|
46
52
|
}
|
47
53
|
end
|
48
54
|
|
49
|
-
def authorize_create
|
50
|
-
authorize_action(:create)
|
55
|
+
def authorize_create(**arguments)
|
56
|
+
authorize_action(:create, **arguments)
|
51
57
|
end
|
52
58
|
|
53
|
-
def authorize_update
|
54
|
-
authorize_action(:update)
|
59
|
+
def authorize_update(**arguments)
|
60
|
+
authorize_action(:update, **arguments)
|
55
61
|
end
|
56
62
|
|
57
|
-
def authorize_destroy
|
58
|
-
authorize_action(:destroy)
|
63
|
+
def authorize_destroy(**arguments)
|
64
|
+
authorize_action(:destroy, **arguments)
|
59
65
|
end
|
60
66
|
|
61
|
-
def authorize_scope(_scope_name = nil)
|
67
|
+
def authorize_scope(_scope_name = nil, with: nil)
|
62
68
|
original_base_scope = instance_method(:base_scope)
|
63
69
|
|
64
70
|
define_method(:base_scope) do |*args, &block|
|
71
|
+
policy = if with
|
72
|
+
with.is_a?(String) ? ActiveSupport::Inflector.safe_constantize(with) : with
|
73
|
+
else
|
74
|
+
ActionPolicy.lookup(self)
|
75
|
+
end
|
76
|
+
|
65
77
|
authorized_scope(
|
66
78
|
original_base_scope.bind(self).call(*args, &block),
|
67
|
-
with:
|
79
|
+
with: policy
|
68
80
|
)
|
69
81
|
end
|
70
82
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: action_policy-graphiti
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrei Mochalov
|
@@ -70,28 +70,28 @@ dependencies:
|
|
70
70
|
name: rake
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - "
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '13.0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - "
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '13.0'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - "
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '3.8'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - "
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '3.8'
|
97
97
|
- !ruby/object:Gem::Dependency
|