iron_hide 0.3.1 → 0.4.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/lib/iron_hide/condition.rb +21 -16
- data/lib/iron_hide/configuration.rb +6 -1
- data/lib/iron_hide/memoize.rb +26 -0
- data/lib/iron_hide/rule.rb +7 -4
- data/lib/iron_hide/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f96504f984094bdbc0cd59532575d48ea63690cd
|
4
|
+
data.tar.gz: f61e250b8bc7cfed8bc65e6f80891f9c28ddd0e5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8c0a108b078135cf5c069f456b250faac2d63d8b997e6988df46aa243512a786c6fae5671c8d41c9cd375d206da2afb52852394c537a4332dd08df98269d11a
|
7
|
+
data.tar.gz: 5e20a1309529d85d4b7615b8e5ed415ad10fce0b7176545890b3f014c57fe7b5b0e9a081e9a34d970a44cf5c4770968e18be74e168dce3c66e7ae993b42d40c4
|
data/lib/iron_hide/condition.rb
CHANGED
@@ -20,7 +20,7 @@ module IronHide
|
|
20
20
|
# @return [EqualCondition, NotEqualCondition]
|
21
21
|
# @raise [IronHide::InvalidConditional] for too many keys
|
22
22
|
#
|
23
|
-
def self.new(params)
|
23
|
+
def self.new(params, cache = NullCache.new)
|
24
24
|
if params.length > 1
|
25
25
|
raise InvalidConditional, "Expected #{params} to have one key"
|
26
26
|
end
|
@@ -30,7 +30,7 @@ module IronHide
|
|
30
30
|
# See: http://ruby-doc.org/core-1.9.3/Class.html#method-i-allocate
|
31
31
|
klass = VALID_TYPES.fetch(type){ raise InvalidConditional, "#{type} is not valid"}
|
32
32
|
cond = IronHide.const_get(klass).allocate
|
33
|
-
cond.send(:initialize,
|
33
|
+
cond.send(:initialize, conditionals, cache)
|
34
34
|
cond
|
35
35
|
end
|
36
36
|
|
@@ -41,11 +41,14 @@ module IronHide
|
|
41
41
|
# 'user::user_role_ids' => ['8']
|
42
42
|
# }
|
43
43
|
#
|
44
|
-
|
44
|
+
# @param [IronHide::SimpleCache, IronHide::NullCache] cache
|
45
|
+
#
|
46
|
+
def initialize(conditionals, cache)
|
45
47
|
@conditionals = conditionals
|
48
|
+
@cache = cache
|
46
49
|
end
|
47
50
|
|
48
|
-
attr_reader :conditionals
|
51
|
+
attr_reader :conditionals, :cache
|
49
52
|
|
50
53
|
# @param user [Object]
|
51
54
|
# @param resource [Object]
|
@@ -93,18 +96,20 @@ module IronHide
|
|
93
96
|
def evaluate(expression, user, resource)
|
94
97
|
Array(expression).flat_map do |el|
|
95
98
|
if expression?(el)
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
99
|
+
cache.fetch(el) {
|
100
|
+
type, *ary = el.split('::')
|
101
|
+
if type == 'user'
|
102
|
+
Array(ary.inject(user) do |rval, attr|
|
103
|
+
rval.freeze.public_send(attr)
|
104
|
+
end)
|
105
|
+
elsif type == 'resource'
|
106
|
+
Array(ary.inject(resource) do |rval, attr|
|
107
|
+
rval.freeze.public_send(attr)
|
108
|
+
end)
|
109
|
+
else
|
110
|
+
raise "Expected #{type} to be 'resource' or 'user'"
|
111
|
+
end
|
112
|
+
}
|
108
113
|
else
|
109
114
|
el
|
110
115
|
end
|
@@ -1,11 +1,16 @@
|
|
1
1
|
module IronHide
|
2
2
|
class Configuration
|
3
3
|
|
4
|
-
attr_accessor :adapter, :namespace, :json
|
4
|
+
attr_accessor :adapter, :namespace, :json, :memoize
|
5
5
|
|
6
6
|
def initialize
|
7
7
|
@adapter = :file
|
8
8
|
@namespace = 'com::IronHide'
|
9
|
+
@memoize = true
|
10
|
+
end
|
11
|
+
|
12
|
+
def memoizer
|
13
|
+
memoize ? SimpleCache : NullCache
|
9
14
|
end
|
10
15
|
|
11
16
|
# Extend configuration variables
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module IronHide
|
2
|
+
|
3
|
+
# The SimpleCache does not expire cache entries
|
4
|
+
# It is used only to memoize method calls during a single authorization
|
5
|
+
# decision.
|
6
|
+
#
|
7
|
+
class SimpleCache
|
8
|
+
attr_accessor :cache
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
@cache = {}
|
12
|
+
end
|
13
|
+
|
14
|
+
def fetch(expression)
|
15
|
+
cache.fetch(expression) {
|
16
|
+
cache[expression] = yield
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class NullCache
|
22
|
+
def fetch(_)
|
23
|
+
yield
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/iron_hide/rule.rb
CHANGED
@@ -1,16 +1,18 @@
|
|
1
|
+
require 'iron_hide/memoize'
|
2
|
+
|
1
3
|
module IronHide
|
2
4
|
class Rule
|
3
5
|
ALLOW = 'allow'.freeze
|
4
6
|
DENY = 'deny'.freeze
|
5
7
|
|
6
|
-
attr_reader :description, :effect, :conditions, :user, :resource
|
8
|
+
attr_reader :description, :effect, :conditions, :user, :resource, :cache
|
7
9
|
|
8
|
-
def initialize(user, resource, params = {})
|
10
|
+
def initialize(user, resource, params = {}, cache = NullCache.new)
|
9
11
|
@user = user
|
10
12
|
@resource = resource
|
11
13
|
@description = params['description']
|
12
14
|
@effect = params.fetch('effect', DENY) # Default DENY
|
13
|
-
@conditions = Array(params['conditions']).map { |c| Condition.new(c) }
|
15
|
+
@conditions = Array(params['conditions']).map { |c| Condition.new(c, cache) }
|
14
16
|
end
|
15
17
|
|
16
18
|
# Returns all applicable rules matching on resource and action
|
@@ -20,9 +22,10 @@ module IronHide
|
|
20
22
|
# @param resource [Object]
|
21
23
|
# @return [Array<IronHide::Rule>]
|
22
24
|
def self.find(user, action, resource)
|
25
|
+
cache = IronHide.configuration.memoizer.new
|
23
26
|
ns_resource = "#{IronHide.configuration.namespace}::#{resource.class.name}"
|
24
27
|
storage.where(resource: ns_resource, action: action).map do |json|
|
25
|
-
new(user, resource, json)
|
28
|
+
new(user, resource, json, cache)
|
26
29
|
end
|
27
30
|
end
|
28
31
|
|
data/lib/iron_hide/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: iron_hide
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alan Cohen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: multi_json
|
@@ -119,6 +119,7 @@ files:
|
|
119
119
|
- lib/iron_hide/condition.rb
|
120
120
|
- lib/iron_hide/configuration.rb
|
121
121
|
- lib/iron_hide/errors.rb
|
122
|
+
- lib/iron_hide/memoize.rb
|
122
123
|
- lib/iron_hide/rule.rb
|
123
124
|
- lib/iron_hide/storage.rb
|
124
125
|
- lib/iron_hide/storage/file_adapter.rb
|