rabarber 4.1.0 → 4.1.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +15 -0
- data/lib/rabarber/core/access.rb +3 -5
- data/lib/rabarber/core/permissions.rb +6 -3
- data/lib/rabarber/core/permissions_integrity_checker.rb +2 -2
- data/lib/rabarber/core/rule.rb +2 -3
- data/lib/rabarber/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: feb905214f327d8aef99517ba1364252b6722430fe6ab1b4839055e1ae5b18fc
|
4
|
+
data.tar.gz: ed0cacc2d6ad0ec5fd436ba24e96c3c26489264c3f00c73822b24f4593b2fa01
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f88384ea24337c233f9183fde8bda61ba2939c3947b9eff07c2b5a47ff44372ba0287258565c3a5e085c4dc80b5026206d7b126e23c58b541b6490778946123
|
7
|
+
data.tar.gz: 9d7d4243f90fdc36cf8c27c391154449b38407a42995791240b72571e2dff14fa3836e62ce43ca92d5d0c65a5835a1e14119a077eda59ebedbe4c6b2a5aa8bac
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
## v4.1.1
|
2
|
+
|
3
|
+
### Bugs:
|
4
|
+
|
5
|
+
- Fixed an issue where controller-wide `grant_access` calls would overwrite each other instead of being additive, causing inconsistent access control based on statement order
|
6
|
+
|
7
|
+
### Misc:
|
8
|
+
|
9
|
+
- Minor performance improvement for authorization checks
|
10
|
+
|
1
11
|
## v4.1.0
|
2
12
|
|
3
13
|
### Features:
|
data/README.md
CHANGED
@@ -323,6 +323,21 @@ end
|
|
323
323
|
```
|
324
324
|
This means that `Crm::InvoicesController` is still accessible to `admin` but is also accessible to `accountant`.
|
325
325
|
|
326
|
+
This applies as well to multiple rules defined for the same controller or action:
|
327
|
+
```rb
|
328
|
+
class Crm::OrdersController < ApplicationController
|
329
|
+
grant_access roles: :manager, context: Order
|
330
|
+
grant_access roles: :admin
|
331
|
+
|
332
|
+
grant_access action: :show, roles: :client, context: -> { Order.find(params[:id]) }
|
333
|
+
grant_access action: :show, roles: :accountant
|
334
|
+
def show
|
335
|
+
# ...
|
336
|
+
end
|
337
|
+
end
|
338
|
+
```
|
339
|
+
This will add rules for `manager` and `admin` roles for all actions in `Crm::OrdersController`, and for `client` and `accountant` roles for the `show` action.
|
340
|
+
|
326
341
|
## Dynamic Authorization Rules
|
327
342
|
|
328
343
|
For more complex cases, Rabarber provides dynamic rules:
|
data/lib/rabarber/core/access.rb
CHANGED
@@ -8,15 +8,13 @@ module Rabarber
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def controller_accessible?(roleable, controller_instance)
|
11
|
-
controller_rules.any? do |
|
12
|
-
controller_instance.is_a?(
|
11
|
+
controller_rules.any? do |controller, rules|
|
12
|
+
controller_instance.is_a?(controller) && rules.any? { _1.verify_access(roleable, controller_instance) }
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
16
|
def action_accessible?(roleable, action, controller_instance)
|
17
|
-
action_rules[controller_instance.class].any?
|
18
|
-
rule.action == action && rule.verify_access(roleable, controller_instance)
|
19
|
-
end
|
17
|
+
action_rules[controller_instance.class][action].any? { _1.verify_access(roleable, controller_instance) }
|
20
18
|
end
|
21
19
|
end
|
22
20
|
end
|
@@ -13,13 +13,16 @@ module Rabarber
|
|
13
13
|
attr_reader :storage
|
14
14
|
|
15
15
|
def initialize
|
16
|
-
@storage = {
|
16
|
+
@storage = {
|
17
|
+
controller_rules: Hash.new { |h, k| h[k] = [] },
|
18
|
+
action_rules: Hash.new { |h1, k1| h1[k1] = Hash.new { |h2, k2| h2[k2] = [] } }
|
19
|
+
}
|
17
20
|
end
|
18
21
|
|
19
22
|
class << self
|
20
23
|
def add(controller, action, roles, context, dynamic_rule, negated_dynamic_rule)
|
21
|
-
rule = Rabarber::Core::Rule.new(
|
22
|
-
action ? action_rules[controller] += [rule] : controller_rules[controller]
|
24
|
+
rule = Rabarber::Core::Rule.new(roles, context, dynamic_rule, negated_dynamic_rule)
|
25
|
+
action ? action_rules[controller][action] += [rule] : controller_rules[controller] += [rule]
|
23
26
|
end
|
24
27
|
|
25
28
|
def controller_rules
|
@@ -21,8 +21,8 @@ module Rabarber
|
|
21
21
|
private
|
22
22
|
|
23
23
|
def missing_list
|
24
|
-
@missing_list ||= action_rules.each_with_object([]) do |(controller,
|
25
|
-
missing_actions =
|
24
|
+
@missing_list ||= action_rules.each_with_object([]) do |(controller, hash), arr|
|
25
|
+
missing_actions = hash.keys - controller.action_methods.map(&:to_sym)
|
26
26
|
arr << { controller => missing_actions } if missing_actions.any?
|
27
27
|
end
|
28
28
|
end
|
data/lib/rabarber/core/rule.rb
CHANGED
@@ -3,10 +3,9 @@
|
|
3
3
|
module Rabarber
|
4
4
|
module Core
|
5
5
|
class Rule
|
6
|
-
attr_reader :
|
6
|
+
attr_reader :roles, :context, :dynamic_rule, :negated_dynamic_rule
|
7
7
|
|
8
|
-
def initialize(
|
9
|
-
@action = action
|
8
|
+
def initialize(roles, context, dynamic_rule, negated_dynamic_rule)
|
10
9
|
@roles = Array(roles)
|
11
10
|
@context = context
|
12
11
|
@dynamic_rule = dynamic_rule || -> { true }
|
data/lib/rabarber/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rabarber
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.1.
|
4
|
+
version: 4.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- enjaku4
|
8
8
|
- trafium
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-01-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|