casbin-ruby 1.0.7 → 1.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/README.md +16 -3
- data/lib/casbin-ruby/config.rb +20 -0
- data/lib/casbin-ruby/core_enforcer.rb +25 -23
- data/lib/casbin-ruby/logger.rb +17 -0
- data/lib/casbin-ruby/management_enforcer.rb +6 -6
- data/lib/casbin-ruby/model/assertion.rb +2 -4
- data/lib/casbin-ruby/model/model.rb +4 -3
- data/lib/casbin-ruby/model/policy.rb +12 -6
- data/lib/casbin-ruby/rbac/default_role_manager/role_manager.rb +3 -5
- data/lib/casbin-ruby/version.rb +1 -1
- data/lib/casbin-ruby.rb +1 -0
- data/spec/casbin/enforcer_spec.rb +164 -0
- metadata +8 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0a6fa41ab5193602d852ba7652d0d92775f1a26243471d154188aca17a5a3a67
|
4
|
+
data.tar.gz: 19174a79a646b395960fd842bec794f8a202d283396c802d872ce7e88914763a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9c40a77ea91e4addeba67652af4fe0bd1af3151f67e2bdfc3625f4c90e295a643d3f2d221446957ebd3a1f4321e3a1869a822a31102c5a6cdf78da3dd572e35d
|
7
|
+
data.tar.gz: 29c3ff1985b8e1480ce596763ce621790cf19f6676649efc6d6e4ac8bb06c476f3d8618db2e72a89a40e1f277da36a5eba5ba598040a4dd3ada102b91fe9c390
|
data/README.md
CHANGED
@@ -131,7 +131,7 @@ What Casbin does NOT do:
|
|
131
131
|
## Installation
|
132
132
|
|
133
133
|
```
|
134
|
-
gem 'casbin
|
134
|
+
gem 'casbin-ruby'
|
135
135
|
```
|
136
136
|
|
137
137
|
## Documentation
|
@@ -151,8 +151,21 @@ https://casbin.org/docs/en/tutorials
|
|
151
151
|
1. New a Casbin enforcer with a model file and a policy file:
|
152
152
|
|
153
153
|
```ruby
|
154
|
-
|
155
|
-
|
154
|
+
require 'casbin-ruby'
|
155
|
+
Casbin::Config.setup do |config|
|
156
|
+
config.model = "path/to/model.conf" # default: nil
|
157
|
+
config.adapter = "path/to/policy.csv" # default: nil
|
158
|
+
config.watcher = Casbin::SomeWatcher # default: nil
|
159
|
+
config.logger = Logger.new($stdout) # default: Logger.new($stdout, level: :error)
|
160
|
+
end
|
161
|
+
|
162
|
+
enforcer = Casbin::Enforcer.new
|
163
|
+
```
|
164
|
+
|
165
|
+
OR
|
166
|
+
|
167
|
+
```ruby
|
168
|
+
require 'casbin-ruby'
|
156
169
|
enforcer = Casbin::Enforcer.new("path/to/model.conf", "path/to/policy.csv")
|
157
170
|
```
|
158
171
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
module Casbin
|
6
|
+
module Config
|
7
|
+
class << self
|
8
|
+
attr_writer :logger
|
9
|
+
attr_accessor :adapter, :model, :watcher
|
10
|
+
|
11
|
+
def setup
|
12
|
+
yield self
|
13
|
+
end
|
14
|
+
|
15
|
+
def logger
|
16
|
+
@logger ||= ::Logger.new($stdout, level: :error)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -9,46 +9,50 @@ require 'casbin-ruby/rbac/default_role_manager/role_manager'
|
|
9
9
|
require 'casbin-ruby/util'
|
10
10
|
require 'casbin-ruby/util/builtin_operators'
|
11
11
|
require 'casbin-ruby/util/evaluator'
|
12
|
-
|
13
|
-
require '
|
12
|
+
require 'casbin-ruby/logger'
|
13
|
+
require 'casbin-ruby/config'
|
14
14
|
|
15
15
|
module Casbin
|
16
16
|
# CoreEnforcer defines the core functionality of an enforcer.
|
17
17
|
# get_attr/set_attr methods is ported from Python as attr/attr=
|
18
18
|
class CoreEnforcer
|
19
|
-
def initialize(model = nil, adapter = nil,
|
19
|
+
def initialize(model = nil, adapter = nil, watcher = nil)
|
20
|
+
model ||= Config.model
|
21
|
+
adapter ||= Config.adapter
|
22
|
+
@watcher = watcher || Config.watcher
|
23
|
+
|
20
24
|
if model.is_a? String
|
21
25
|
if adapter.is_a? String
|
22
|
-
init_with_file(model, adapter
|
26
|
+
init_with_file(model, adapter)
|
23
27
|
else
|
24
|
-
init_with_adapter(model, adapter
|
28
|
+
init_with_adapter(model, adapter)
|
25
29
|
end
|
26
30
|
elsif adapter.is_a? String
|
27
31
|
raise 'Invalid parameters for enforcer.'
|
28
32
|
else
|
29
|
-
init_with_model_and_adapter(model, adapter
|
33
|
+
init_with_model_and_adapter(model, adapter)
|
30
34
|
end
|
31
35
|
end
|
32
36
|
|
33
|
-
attr_accessor :
|
34
|
-
attr_reader :model
|
37
|
+
attr_accessor :auto_build_role_links, :auto_save, :effector, :enabled, :rm_map
|
38
|
+
attr_reader :adapter, :model, :watcher
|
35
39
|
|
36
40
|
# initializes an enforcer with a model file and a policy file.
|
37
|
-
def init_with_file(model_path, policy_path
|
41
|
+
def init_with_file(model_path, policy_path)
|
38
42
|
a = Persist::Adapters::FileAdapter.new(policy_path)
|
39
|
-
init_with_adapter(model_path, a
|
43
|
+
init_with_adapter(model_path, a)
|
40
44
|
end
|
41
45
|
|
42
46
|
# initializes an enforcer with a database adapter.
|
43
|
-
def init_with_adapter(model_path, adapter = nil
|
47
|
+
def init_with_adapter(model_path, adapter = nil)
|
44
48
|
m = new_model(model_path)
|
45
|
-
init_with_model_and_adapter(m, adapter
|
49
|
+
init_with_model_and_adapter(m, adapter)
|
46
50
|
|
47
51
|
self.model_path = model_path
|
48
52
|
end
|
49
53
|
|
50
54
|
# initializes an enforcer with a model and a database adapter.
|
51
|
-
def init_with_model_and_adapter(m, adapter = nil
|
55
|
+
def init_with_model_and_adapter(m, adapter = nil)
|
52
56
|
if !m.is_a?(Model::Model) || (!adapter.nil? && !adapter.is_a?(Persist::Adapter))
|
53
57
|
raise StandardError, 'Invalid parameters for enforcer.'
|
54
58
|
end
|
@@ -59,15 +63,15 @@ module Casbin
|
|
59
63
|
model.print_model
|
60
64
|
self.fm = Model::FunctionMap.load_function_map
|
61
65
|
|
62
|
-
init
|
66
|
+
init
|
63
67
|
|
64
68
|
# Do not initialize the full policy when using a filtered adapter
|
65
69
|
load_policy if adapter && !filtered?
|
66
70
|
end
|
67
71
|
|
68
72
|
# creates a model.
|
69
|
-
def self.new_model(path = '', text = ''
|
70
|
-
m = Model::Model.new
|
73
|
+
def self.new_model(path = '', text = '')
|
74
|
+
m = Model::Model.new
|
71
75
|
if path.length.positive?
|
72
76
|
m.load_model(path)
|
73
77
|
else
|
@@ -291,13 +295,13 @@ module Casbin
|
|
291
295
|
protected
|
292
296
|
|
293
297
|
attr_accessor :model_path, :fm, :auto_motify_watcher
|
294
|
-
attr_reader :logger
|
295
298
|
|
296
299
|
private
|
297
300
|
|
298
301
|
attr_accessor :matcher_map
|
302
|
+
attr_writer :adapter
|
299
303
|
|
300
|
-
def init
|
304
|
+
def init
|
301
305
|
self.rm_map = {}
|
302
306
|
self.effector = Effect::DefaultEffector.get_effector(model.model['e']['e'].value)
|
303
307
|
|
@@ -305,8 +309,6 @@ module Casbin
|
|
305
309
|
self.auto_save = true
|
306
310
|
self.auto_build_role_links = true
|
307
311
|
|
308
|
-
@logger = logger
|
309
|
-
|
310
312
|
init_rm_map
|
311
313
|
end
|
312
314
|
|
@@ -338,10 +340,10 @@ module Casbin
|
|
338
340
|
req_str = "Request: #{rvals.map(&:to_s).join ', '} ---> #{result}"
|
339
341
|
|
340
342
|
if result
|
341
|
-
|
343
|
+
Logger.info(req_str)
|
342
344
|
else
|
343
345
|
# leaving this in error for now, if it's very noise this can be changed to info or debug
|
344
|
-
|
346
|
+
Logger.error(req_str)
|
345
347
|
end
|
346
348
|
end
|
347
349
|
|
@@ -349,7 +351,7 @@ module Casbin
|
|
349
351
|
return unless model.model.keys.include?('g')
|
350
352
|
|
351
353
|
model.model['g'].each_key do |ptype|
|
352
|
-
rm_map[ptype] = Rbac::DefaultRoleManager::RoleManager.new(10
|
354
|
+
rm_map[ptype] = Rbac::DefaultRoleManager::RoleManager.new(10)
|
353
355
|
end
|
354
356
|
end
|
355
357
|
end
|
@@ -102,7 +102,7 @@ module Casbin
|
|
102
102
|
if params.size == 1 && params[0].is_a?(Array)
|
103
103
|
model.has_policy('p', ptype, params[0])
|
104
104
|
else
|
105
|
-
model.has_policy('p', ptype,
|
105
|
+
model.has_policy('p', ptype, params)
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
@@ -130,7 +130,7 @@ module Casbin
|
|
130
130
|
if params.size == 1 && params[0].is_a?(Array)
|
131
131
|
parent_add_policy('p', ptype, params[0])
|
132
132
|
else
|
133
|
-
parent_add_policy('p', ptype,
|
133
|
+
parent_add_policy('p', ptype, params)
|
134
134
|
end
|
135
135
|
end
|
136
136
|
|
@@ -182,7 +182,7 @@ module Casbin
|
|
182
182
|
if params.size == 1 && params[0].is_a?(Array)
|
183
183
|
parent_remove_policy('p', ptype, params[0])
|
184
184
|
else
|
185
|
-
parent_remove_policy('p', ptype,
|
185
|
+
parent_remove_policy('p', ptype, params)
|
186
186
|
end
|
187
187
|
end
|
188
188
|
|
@@ -206,7 +206,7 @@ module Casbin
|
|
206
206
|
if params.size == 1 && params[0].is_a?(Array)
|
207
207
|
model.has_policy('g', ptype, params[0])
|
208
208
|
else
|
209
|
-
model.has_policy('g', ptype,
|
209
|
+
model.has_policy('g', ptype, params)
|
210
210
|
end
|
211
211
|
end
|
212
212
|
|
@@ -235,7 +235,7 @@ module Casbin
|
|
235
235
|
rule_added = if params.size == 1 && params[0].is_a?(Array)
|
236
236
|
parent_add_policy('g', ptype, params[0])
|
237
237
|
else
|
238
|
-
parent_add_policy('g', ptype,
|
238
|
+
parent_add_policy('g', ptype, params)
|
239
239
|
end
|
240
240
|
|
241
241
|
auto_build_role_links ? build_role_links : rule_added
|
@@ -271,7 +271,7 @@ module Casbin
|
|
271
271
|
rule_added = if params.size == 1 && params[0].is_a?(Array)
|
272
272
|
parent_remove_policy('g', ptype, params[0])
|
273
273
|
else
|
274
|
-
parent_remove_policy('g', ptype,
|
274
|
+
parent_remove_policy('g', ptype, params)
|
275
275
|
end
|
276
276
|
|
277
277
|
auto_build_role_links ? build_role_links : rule_added
|
@@ -1,19 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'logger'
|
3
|
+
require 'casbin-ruby/logger'
|
4
4
|
|
5
5
|
module Casbin
|
6
6
|
module Model
|
7
7
|
class Assertion
|
8
8
|
attr_accessor :key, :value, :tokens, :policy, :rm
|
9
|
-
attr_reader :logger
|
10
9
|
|
11
10
|
def initialize(hash = {})
|
12
11
|
@key = hash[:key].to_s
|
13
12
|
@value = hash[:value].to_s
|
14
13
|
@tokens = [*hash[:tokens]]
|
15
14
|
@policy = [*hash[:policy]]
|
16
|
-
@logger = hash[:logger] || Logger.new($stdout)
|
17
15
|
end
|
18
16
|
|
19
17
|
def build_role_links(rm)
|
@@ -24,7 +22,7 @@ module Casbin
|
|
24
22
|
raise 'grouping policy elements do not meet role definition' if rule.size < count
|
25
23
|
|
26
24
|
rm.add_link(*rule)
|
27
|
-
|
25
|
+
Logger.info("Role links for: #{key}")
|
28
26
|
rm.print_roles
|
29
27
|
end
|
30
28
|
end
|
@@ -4,6 +4,7 @@ require 'casbin-ruby/model/policy'
|
|
4
4
|
require 'casbin-ruby/model/assertion'
|
5
5
|
require 'casbin-ruby/config/config'
|
6
6
|
require 'casbin-ruby/util'
|
7
|
+
require 'casbin-ruby/logger'
|
7
8
|
|
8
9
|
module Casbin
|
9
10
|
module Model
|
@@ -29,7 +30,7 @@ module Casbin
|
|
29
30
|
def add_def(sec, key, value)
|
30
31
|
return false if value == ''
|
31
32
|
|
32
|
-
ast = Assertion.new(key: key, value: value
|
33
|
+
ast = Assertion.new(key: key, value: value)
|
33
34
|
%w[r p].include?(sec) ? ast_tokens_set(ast, key) : model_sec_set(ast)
|
34
35
|
|
35
36
|
model[sec] ||= {}
|
@@ -37,11 +38,11 @@ module Casbin
|
|
37
38
|
end
|
38
39
|
|
39
40
|
def print_model
|
40
|
-
|
41
|
+
Logger.info 'Model:'
|
41
42
|
|
42
43
|
model.each do |k, v|
|
43
44
|
v.each do |i, j|
|
44
|
-
|
45
|
+
Logger.info "#{k}.#{i}: #{j.value}"
|
45
46
|
end
|
46
47
|
end
|
47
48
|
end
|
@@ -1,15 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'logger'
|
3
|
+
require 'casbin-ruby/logger'
|
4
4
|
|
5
5
|
module Casbin
|
6
6
|
module Model
|
7
7
|
class Policy
|
8
|
-
attr_reader :model
|
8
|
+
attr_reader :model
|
9
9
|
|
10
|
-
def initialize
|
10
|
+
def initialize
|
11
11
|
@model = {}
|
12
|
-
@logger = logger
|
13
12
|
end
|
14
13
|
|
15
14
|
# initializes the roles in RBAC.
|
@@ -24,13 +23,13 @@ module Casbin
|
|
24
23
|
|
25
24
|
# Log using info
|
26
25
|
def print_policy
|
27
|
-
|
26
|
+
Logger.info 'Policy:'
|
28
27
|
|
29
28
|
%w[p g].each do |sec|
|
30
29
|
next unless model.key? sec
|
31
30
|
|
32
31
|
model[sec].each do |key, ast|
|
33
|
-
|
32
|
+
Logger.info "#{key} : #{ast.value} : #{ast.policy}"
|
34
33
|
end
|
35
34
|
end
|
36
35
|
end
|
@@ -112,6 +111,13 @@ module Casbin
|
|
112
111
|
true
|
113
112
|
end
|
114
113
|
|
114
|
+
# gets rules based on field filters from a policy.
|
115
|
+
def get_filtered_policy(sec, ptype, field_index, *field_values)
|
116
|
+
model[sec][ptype].policy.select do |rule|
|
117
|
+
field_values.select { |value| rule[field_index] == value }.any?
|
118
|
+
end.compact
|
119
|
+
end
|
120
|
+
|
115
121
|
# removes policy rules based on field filters from the model.
|
116
122
|
def remove_filtered_policy(sec, ptype, field_index, *field_values)
|
117
123
|
return false unless model.key?(sec)
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'logger'
|
4
3
|
require 'casbin-ruby/rbac/role_manager'
|
5
4
|
require 'casbin-ruby/rbac/default_role_manager/role'
|
5
|
+
require 'casbin-ruby/logger'
|
6
6
|
|
7
7
|
module Casbin
|
8
8
|
module Rbac
|
@@ -10,11 +10,9 @@ module Casbin
|
|
10
10
|
# provides a default implementation for the RoleManager interface
|
11
11
|
class RoleManager < Rbac::RoleManager
|
12
12
|
attr_accessor :all_roles, :max_hierarchy_level, :matching_func, :has_domain_pattern, :domain_matching_func
|
13
|
-
attr_reader :logger
|
14
13
|
|
15
|
-
def initialize(max_hierarchy_level
|
14
|
+
def initialize(max_hierarchy_level)
|
16
15
|
super()
|
17
|
-
@logger = logger
|
18
16
|
@all_roles = {}
|
19
17
|
@max_hierarchy_level = max_hierarchy_level
|
20
18
|
end
|
@@ -120,7 +118,7 @@ module Casbin
|
|
120
118
|
|
121
119
|
def print_roles
|
122
120
|
line = all_roles.map { |_key, role| role.to_string }.compact
|
123
|
-
|
121
|
+
Logger.info(line.join(', '))
|
124
122
|
end
|
125
123
|
|
126
124
|
private
|
data/lib/casbin-ruby/version.rb
CHANGED
data/lib/casbin-ruby.rb
CHANGED
@@ -29,6 +29,11 @@ describe Casbin::Enforcer do
|
|
29
29
|
expect(enf.model).not_to be_nil
|
30
30
|
end
|
31
31
|
|
32
|
+
it '#get_filtered_policy' do
|
33
|
+
expect(enf.enforce('alice', 'data1', 'read')).to be_truthy
|
34
|
+
expect(enf.get_filtered_policy(0, 'alice')).to match_array([%w[alice data1 read]])
|
35
|
+
end
|
36
|
+
|
32
37
|
it '#remove_filtered_policy' do
|
33
38
|
expect(enf.enforce('alice', 'data1', 'read')).to be_truthy
|
34
39
|
enf.remove_filtered_policy(1, 'data1')
|
@@ -38,6 +43,63 @@ describe Casbin::Enforcer do
|
|
38
43
|
enf.remove_filtered_policy(2, 'write')
|
39
44
|
expect(enf.enforce('bob', 'data2', 'write')).to be_falsey
|
40
45
|
end
|
46
|
+
|
47
|
+
it '#add_policy' do
|
48
|
+
expect(enf.enforce('alice', 'data3', 'read')).to be_falsey
|
49
|
+
enf.add_policy('alice', 'data3', 'read')
|
50
|
+
enf.add_policy('alice', 'data4', 'read')
|
51
|
+
enf.add_policy(%w[alice data5 read])
|
52
|
+
expect(enf.enforce('alice', 'data3', 'read')).to be_truthy
|
53
|
+
expect(enf.enforce('alice', 'data4', 'read')).to be_truthy
|
54
|
+
expect(enf.enforce('alice', 'data5', 'read')).to be_truthy
|
55
|
+
end
|
56
|
+
|
57
|
+
it '#remove_policy' do
|
58
|
+
enf.add_policy('alice', 'data3', 'read')
|
59
|
+
expect(enf.enforce('alice', 'data3', 'read')).to be_truthy
|
60
|
+
enf.remove_policy('alice', 'data3', 'read')
|
61
|
+
expect(enf.enforce('alice', 'data3', 'read')).to be_falsey
|
62
|
+
enf.add_policy('alice', 'data3', 'read')
|
63
|
+
expect(enf.enforce('alice', 'data3', 'read')).to be_truthy
|
64
|
+
enf.remove_policy(%w[alice data3 read])
|
65
|
+
expect(enf.enforce('alice', 'data3', 'read')).to be_falsey
|
66
|
+
end
|
67
|
+
|
68
|
+
# rubocop:disable RSpec/RepeatedExample
|
69
|
+
it '#delete_permission' do
|
70
|
+
# TODO: Add support this method
|
71
|
+
# expect(enf.enforce('bob', 'data2', 'write')).to be_truthy
|
72
|
+
# expect(enf.enforce('data2_admin', 'data2', 'read')).to be_truthy
|
73
|
+
# expect(enf.enforce('data2_admin', 'data2', 'write')).to be_truthy
|
74
|
+
# expect(enf.delete_permission('data2')).to be_truthy
|
75
|
+
# expect(enf.enforce('bob', 'data2', 'write')).to be_falsey
|
76
|
+
# expect(enf.enforce('data2_admin', 'data2', 'read')).to be_falsey
|
77
|
+
# expect(enf.enforce('data2_admin', 'data2', 'write')).to be_falsey
|
78
|
+
end
|
79
|
+
|
80
|
+
it '#delete_permissions_for_user' do
|
81
|
+
# TODO: Add support this method
|
82
|
+
# expect(enf.enforce('alice', 'data1', 'read')).to be_truthy
|
83
|
+
# expect(enf.delete_permissions_for_user('alice')).to be_truthy
|
84
|
+
# expect(enf.enforce('alice', 'data1', 'read')).to be_falsey
|
85
|
+
end
|
86
|
+
|
87
|
+
it '#get_permissions_for_user' do
|
88
|
+
# TODO: Add support this method
|
89
|
+
# expect(enf.get_permissions_for_user('alice')).to match_array([%w[alice data1 read],
|
90
|
+
# %w[data2_admin data2 read],
|
91
|
+
# %w[data2_admin data2 write]])
|
92
|
+
end
|
93
|
+
# rubocop:enable RSpec/RepeatedExample
|
94
|
+
|
95
|
+
it '#has_permission_for_user' do
|
96
|
+
expect(enf.has_permission_for_user('alice', 'data1', 'read')).to be_truthy
|
97
|
+
expect(enf.has_permission_for_user('alice', 'data1', 'write')).to be_falsey
|
98
|
+
end
|
99
|
+
|
100
|
+
it '#get_implicit_permissions_for_user' do
|
101
|
+
expect(enf.get_implicit_permissions_for_user('alice')).to match_array([%w[alice data1 read]])
|
102
|
+
end
|
41
103
|
end
|
42
104
|
|
43
105
|
describe 'basic without spaces' do
|
@@ -150,6 +212,80 @@ describe Casbin::Enforcer do
|
|
150
212
|
expect(enf.enforce('alice', 'data2', 'write')).to be_truthy
|
151
213
|
expect(enf.enforce('bogus', 'data2', 'write')).to be_falsey
|
152
214
|
end
|
215
|
+
|
216
|
+
it '#add_grouping_policy' do
|
217
|
+
expect(enf.enforce('alice', 'data3', 'read')).to be_falsey
|
218
|
+
enf.add_policy('base', 'data3', 'read')
|
219
|
+
enf.add_policy(%w[alice data4 read])
|
220
|
+
enf.add_grouping_policy('alice', 'base')
|
221
|
+
enf.add_grouping_policy(%w[bob base])
|
222
|
+
expect(enf.enforce('alice', 'data3', 'read')).to be_truthy
|
223
|
+
expect(enf.enforce('bob', 'data3', 'read')).to be_truthy
|
224
|
+
expect(enf.enforce('alice', 'data4', 'read')).to be_truthy
|
225
|
+
expect(enf.enforce('bob', 'data4', 'read')).to be_falsey
|
226
|
+
end
|
227
|
+
|
228
|
+
it '#get_roles_for_user' do
|
229
|
+
expect(enf.get_roles_for_user('alice')).to match_array(['data2_admin'])
|
230
|
+
expect(enf.get_roles_for_user('bob')).to match_array([])
|
231
|
+
end
|
232
|
+
|
233
|
+
it '#get_users_for_role' do
|
234
|
+
expect(enf.get_users_for_role('data2_admin')).to match_array(['alice'])
|
235
|
+
expect(enf.get_users_for_role('data1_admin')).to match_array([])
|
236
|
+
end
|
237
|
+
|
238
|
+
it '#has_role_for_user' do
|
239
|
+
expect(enf.has_role_for_user('alice', 'data2_admin')).to be_truthy
|
240
|
+
expect(enf.has_role_for_user('bob', 'data2_admin')).to be_falsey
|
241
|
+
end
|
242
|
+
|
243
|
+
it '#add_role_for_user' do
|
244
|
+
expect(enf.has_role_for_user('alice', 'manager')).to be_falsey
|
245
|
+
expect(enf.add_role_for_user('alice', 'manager')).to be_truthy
|
246
|
+
expect(enf.has_role_for_user('alice', 'manager')).to be_truthy
|
247
|
+
end
|
248
|
+
|
249
|
+
it '#delete_role_for_user' do
|
250
|
+
expect(enf.has_role_for_user('alice', 'data2_admin')).to be_truthy
|
251
|
+
expect(enf.delete_role_for_user('alice', 'data2_admin')).to be_truthy
|
252
|
+
expect(enf.has_role_for_user('alice', 'data2_admin')).to be_falsey
|
253
|
+
end
|
254
|
+
|
255
|
+
it '#delete_roles_for_user' do
|
256
|
+
enf.add_grouping_policy('alice', 'base')
|
257
|
+
expect(enf.delete_roles_for_user('alice')).to be_truthy
|
258
|
+
expect(enf.get_roles_for_user('alice')).to match_array([])
|
259
|
+
end
|
260
|
+
|
261
|
+
it '#delete_user' do
|
262
|
+
expect(enf.enforce('alice', 'data1', 'read')).to be_truthy
|
263
|
+
expect(enf.has_role_for_user('alice', 'data2_admin')).to be_truthy
|
264
|
+
expect(enf.delete_user('alice')).to be_truthy
|
265
|
+
expect(enf.enforce('alice', 'data1', 'read')).to be_falsey
|
266
|
+
expect(enf.has_role_for_user('alice', 'data2_admin')).to be_falsey
|
267
|
+
end
|
268
|
+
|
269
|
+
it '#delete_role' do
|
270
|
+
expect(enf.enforce('data2_admin', 'data2', 'read')).to be_truthy
|
271
|
+
expect(enf.has_role_for_user('alice', 'data2_admin')).to be_truthy
|
272
|
+
expect(enf.delete_role('data2_admin')).to be_truthy
|
273
|
+
expect(enf.enforce('data2_admin', 'data2', 'read')).to be_falsey
|
274
|
+
expect(enf.has_role_for_user('alice', 'data2_admin')).to be_falsey
|
275
|
+
end
|
276
|
+
|
277
|
+
# rubocop:disable RSpec/RepeatedExample
|
278
|
+
it '#get_implicit_roles_for_user' do
|
279
|
+
# TODO: Add support this method
|
280
|
+
# enf.add_role_for_user('data2_admin', 'super_admin')
|
281
|
+
# expect(enf.get_implicit_roles_for_user('alice')).to match_array(%w[data2_admin super_admin])
|
282
|
+
end
|
283
|
+
|
284
|
+
it '#get_implicit_users_for_permission' do
|
285
|
+
# TODO: Add support this method
|
286
|
+
# expect(enf.get_implicit_users_for_permission('data2', 'write')).to match_array(%w[alice bob])
|
287
|
+
end
|
288
|
+
# rubocop:enable RSpec/RepeatedExample
|
153
289
|
end
|
154
290
|
|
155
291
|
describe 'rbac empty policy' do
|
@@ -189,6 +325,34 @@ describe Casbin::Enforcer do
|
|
189
325
|
expect(enf.enforce('bob', 'domain2', 'data2', 'read')).to be_truthy
|
190
326
|
expect(enf.enforce('bob', 'domain2', 'data2', 'write')).to be_truthy
|
191
327
|
end
|
328
|
+
|
329
|
+
it '#get_roles_for_user_in_domain' do
|
330
|
+
expect(enf.get_roles_for_user_in_domain('alice', 'domain1')).to match_array(%w[admin])
|
331
|
+
expect(enf.get_roles_for_user_in_domain('bob', 'domain2')).to match_array(%w[admin])
|
332
|
+
end
|
333
|
+
|
334
|
+
it '#get_users_for_role_in_domain' do
|
335
|
+
expect(enf.get_users_for_role_in_domain('admin', 'domain1')).to match_array(%w[alice])
|
336
|
+
expect(enf.get_users_for_role_in_domain('admin', 'domain2')).to match_array(%w[bob])
|
337
|
+
end
|
338
|
+
|
339
|
+
it '#delete_roles_for_user_in_domain' do
|
340
|
+
enf.delete_roles_for_user_in_domain('alice', 'admin', 'domain1')
|
341
|
+
expect(enf.get_roles_for_user_in_domain('alice', 'domain1')).to match_array(%w[])
|
342
|
+
end
|
343
|
+
|
344
|
+
it '#get_permissions_for_user_in_domain' do
|
345
|
+
expect(enf.get_permissions_for_user_in_domain('admin', 'domain1'))
|
346
|
+
.to match_array([%w[admin domain1 data1 read],
|
347
|
+
%w[admin domain1 data1 write],
|
348
|
+
%w[admin domain2 data2 read],
|
349
|
+
%w[admin domain2 data2 write]])
|
350
|
+
expect(enf.get_permissions_for_user_in_domain('admin', 'domain2'))
|
351
|
+
.to match_array([%w[admin domain1 data1 read],
|
352
|
+
%w[admin domain1 data1 write],
|
353
|
+
%w[admin domain2 data2 read],
|
354
|
+
%w[admin domain2 data2 write]])
|
355
|
+
end
|
192
356
|
end
|
193
357
|
|
194
358
|
describe 'rbac with not deny' do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: casbin-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Igor Kutyavin
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2021-
|
12
|
+
date: 2021-09-09 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: keisan
|
@@ -78,6 +78,7 @@ extra_rdoc_files: []
|
|
78
78
|
files:
|
79
79
|
- README.md
|
80
80
|
- lib/casbin-ruby.rb
|
81
|
+
- lib/casbin-ruby/config.rb
|
81
82
|
- lib/casbin-ruby/config/config.rb
|
82
83
|
- lib/casbin-ruby/core_enforcer.rb
|
83
84
|
- lib/casbin-ruby/effect/allow_and_deny_effector.rb
|
@@ -88,6 +89,7 @@ files:
|
|
88
89
|
- lib/casbin-ruby/effect/priority_effector.rb
|
89
90
|
- lib/casbin-ruby/enforcer.rb
|
90
91
|
- lib/casbin-ruby/internal_enforcer.rb
|
92
|
+
- lib/casbin-ruby/logger.rb
|
91
93
|
- lib/casbin-ruby/management_enforcer.rb
|
92
94
|
- lib/casbin-ruby/model/assertion.rb
|
93
95
|
- lib/casbin-ruby/model/function_map.rb
|
@@ -141,11 +143,11 @@ specification_version: 4
|
|
141
143
|
summary: Casbin in Ruby
|
142
144
|
test_files:
|
143
145
|
- spec/support/model_helper.rb
|
144
|
-
- spec/casbin/core_enforcer_spec.rb
|
145
|
-
- spec/casbin/rbac/default_role_manager/role_manager_spec.rb
|
146
|
-
- spec/casbin/rbac/default_role_manager/role_spec.rb
|
147
146
|
- spec/casbin/config/config_spec.rb
|
147
|
+
- spec/casbin/enforcer_spec.rb
|
148
148
|
- spec/casbin/model/function_map_spec.rb
|
149
149
|
- spec/casbin/util_spec.rb
|
150
|
+
- spec/casbin/core_enforcer_spec.rb
|
150
151
|
- spec/casbin/util/builtin_operators_spec.rb
|
151
|
-
- spec/casbin/
|
152
|
+
- spec/casbin/rbac/default_role_manager/role_manager_spec.rb
|
153
|
+
- spec/casbin/rbac/default_role_manager/role_spec.rb
|