From 9e4f0d1641b726b93db859e2f5ef8056b259db2a Mon Sep 17 00:00:00 2001 From: Jokius Date: Tue, 7 Sep 2021 16:20:07 +0300 Subject: [PATCH 1/4] Change show logs --- lib/casbin-ruby/core_enforcer.rb | 40 +++++++++---------- lib/casbin-ruby/logger.rb | 20 ++++++++++ lib/casbin-ruby/model/assertion.rb | 6 +-- lib/casbin-ruby/model/model.rb | 7 ++-- lib/casbin-ruby/model/policy.rb | 11 +++-- .../rbac/default_role_manager/role_manager.rb | 8 ++-- lib/casbin-ruby/version.rb | 2 +- 7 files changed, 54 insertions(+), 40 deletions(-) create mode 100644 lib/casbin-ruby/logger.rb diff --git a/lib/casbin-ruby/core_enforcer.rb b/lib/casbin-ruby/core_enforcer.rb index 323c142..6d9596e 100644 --- a/lib/casbin-ruby/core_enforcer.rb +++ b/lib/casbin-ruby/core_enforcer.rb @@ -9,24 +9,25 @@ require 'casbin-ruby/util' require 'casbin-ruby/util/builtin_operators' require 'casbin-ruby/util/evaluator' - -require 'logger' +require 'casbin-ruby/logger' module Casbin # CoreEnforcer defines the core functionality of an enforcer. # get_attr/set_attr methods is ported from Python as attr/attr= class CoreEnforcer - def initialize(model = nil, adapter = nil, logger: Logger.new($stdout)) + def initialize(model = nil, adapter = nil, logger: ::Logger.new($stdout), level: 'error') + Logger.register(logger, level) + if model.is_a? String if adapter.is_a? String - init_with_file(model, adapter, logger: logger) + init_with_file(model, adapter) else - init_with_adapter(model, adapter, logger: logger) + init_with_adapter(model, adapter) end elsif adapter.is_a? String raise 'Invalid parameters for enforcer.' else - init_with_model_and_adapter(model, adapter, logger: logger) + init_with_model_and_adapter(model, adapter) end end @@ -34,21 +35,21 @@ def initialize(model = nil, adapter = nil, logger: Logger.new($stdout)) attr_reader :model # initializes an enforcer with a model file and a policy file. - def init_with_file(model_path, policy_path, logger: Logger.new($stdout)) + def init_with_file(model_path, policy_path) a = Persist::Adapters::FileAdapter.new(policy_path) - init_with_adapter(model_path, a, logger: logger) + init_with_adapter(model_path, a) end # initializes an enforcer with a database adapter. - def init_with_adapter(model_path, adapter = nil, logger: Logger.new($stdout)) + def init_with_adapter(model_path, adapter = nil) m = new_model(model_path) - init_with_model_and_adapter(m, adapter, logger: logger) + init_with_model_and_adapter(m, adapter) self.model_path = model_path end # initializes an enforcer with a model and a database adapter. - def init_with_model_and_adapter(m, adapter = nil, logger: Logger.new($stdout)) + def init_with_model_and_adapter(m, adapter = nil) if !m.is_a?(Model::Model) || (!adapter.nil? && !adapter.is_a?(Persist::Adapter)) raise StandardError, 'Invalid parameters for enforcer.' end @@ -59,15 +60,15 @@ def init_with_model_and_adapter(m, adapter = nil, logger: Logger.new($stdout)) model.print_model self.fm = Model::FunctionMap.load_function_map - init(logger: logger) + init # Do not initialize the full policy when using a filtered adapter load_policy if adapter && !filtered? end # creates a model. - def self.new_model(path = '', text = '', logger: Logger.new($stdout)) - m = Model::Model.new logger: logger + def self.new_model(path = '', text = '') + m = Model::Model.new if path.length.positive? m.load_model(path) else @@ -291,13 +292,12 @@ def enforce_ex(*rvals) protected attr_accessor :model_path, :fm, :auto_motify_watcher - attr_reader :logger private attr_accessor :matcher_map - def init(logger: Logger.new($stdout)) + def init self.rm_map = {} self.effector = Effect::DefaultEffector.get_effector(model.model['e']['e'].value) @@ -305,8 +305,6 @@ def init(logger: Logger.new($stdout)) self.auto_save = true self.auto_build_role_links = true - @logger = logger - init_rm_map end @@ -338,10 +336,10 @@ def log_request(rvals, result) req_str = "Request: #{rvals.map(&:to_s).join ', '} ---> #{result}" if result - logger.info(req_str) + Logger.info(req_str) else # leaving this in error for now, if it's very noise this can be changed to info or debug - logger.error(req_str) + Logger.error(req_str) end end @@ -349,7 +347,7 @@ def init_rm_map return unless model.model.keys.include?('g') model.model['g'].each_key do |ptype| - rm_map[ptype] = Rbac::DefaultRoleManager::RoleManager.new(10, logger: logger) + rm_map[ptype] = Rbac::DefaultRoleManager::RoleManager.new(10) end end end diff --git a/lib/casbin-ruby/logger.rb b/lib/casbin-ruby/logger.rb new file mode 100644 index 0000000..85a8270 --- /dev/null +++ b/lib/casbin-ruby/logger.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module Casbin + module Logger + module_function + + def register(logger, level) + @logger = logger + @level = level + end + + def info(value) + @logger.info(value) if @level == 'info' + end + + def error(value) + @logger.error(value) if @level == 'info' || @level == 'error' + end + end +end diff --git a/lib/casbin-ruby/model/assertion.rb b/lib/casbin-ruby/model/assertion.rb index 5b953ac..14b780b 100644 --- a/lib/casbin-ruby/model/assertion.rb +++ b/lib/casbin-ruby/model/assertion.rb @@ -1,19 +1,17 @@ # frozen_string_literal: true -require 'logger' +require 'casbin-ruby/logger' module Casbin module Model class Assertion attr_accessor :key, :value, :tokens, :policy, :rm - attr_reader :logger def initialize(hash = {}) @key = hash[:key].to_s @value = hash[:value].to_s @tokens = [*hash[:tokens]] @policy = [*hash[:policy]] - @logger = hash[:logger] || Logger.new($stdout) end def build_role_links(rm) @@ -24,7 +22,7 @@ def build_role_links(rm) raise 'grouping policy elements do not meet role definition' if rule.size < count rm.add_link(*rule) - logger.info("Role links for: #{key}") + Logger.info("Role links for: #{key}") rm.print_roles end end diff --git a/lib/casbin-ruby/model/model.rb b/lib/casbin-ruby/model/model.rb index a0dab6f..d80de2d 100644 --- a/lib/casbin-ruby/model/model.rb +++ b/lib/casbin-ruby/model/model.rb @@ -4,6 +4,7 @@ require 'casbin-ruby/model/assertion' require 'casbin-ruby/config/config' require 'casbin-ruby/util' +require 'casbin-ruby/logger' module Casbin module Model @@ -29,7 +30,7 @@ def load_model_from_text(text) def add_def(sec, key, value) return false if value == '' - ast = Assertion.new(key: key, value: value, logger: logger) + ast = Assertion.new(key: key, value: value) %w[r p].include?(sec) ? ast_tokens_set(ast, key) : model_sec_set(ast) model[sec] ||= {} @@ -37,11 +38,11 @@ def add_def(sec, key, value) end def print_model - logger.info 'Model:' + Logger.info 'Model:' model.each do |k, v| v.each do |i, j| - logger.info "#{k}.#{i}: #{j.value}" + Logger.info "#{k}.#{i}: #{j.value}" end end end diff --git a/lib/casbin-ruby/model/policy.rb b/lib/casbin-ruby/model/policy.rb index 3b5e33a..b5407ae 100644 --- a/lib/casbin-ruby/model/policy.rb +++ b/lib/casbin-ruby/model/policy.rb @@ -1,15 +1,14 @@ # frozen_string_literal: true -require 'logger' +require 'casbin-ruby/logger' module Casbin module Model class Policy - attr_reader :model, :logger + attr_reader :model - def initialize(logger: Logger.new($stdout)) + def initialize @model = {} - @logger = logger end # initializes the roles in RBAC. @@ -24,13 +23,13 @@ def build_role_links(rm_map) # Log using info def print_policy - logger.info 'Policy:' + Logger.info 'Policy:' %w[p g].each do |sec| next unless model.key? sec model[sec].each do |key, ast| - logger.info "#{key} : #{ast.value} : #{ast.policy}" + Logger.info "#{key} : #{ast.value} : #{ast.policy}" end end end diff --git a/lib/casbin-ruby/rbac/default_role_manager/role_manager.rb b/lib/casbin-ruby/rbac/default_role_manager/role_manager.rb index c470d7f..c94357d 100644 --- a/lib/casbin-ruby/rbac/default_role_manager/role_manager.rb +++ b/lib/casbin-ruby/rbac/default_role_manager/role_manager.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true -require 'logger' require 'casbin-ruby/rbac/role_manager' require 'casbin-ruby/rbac/default_role_manager/role' +require 'casbin-ruby/logger' module Casbin module Rbac @@ -10,11 +10,9 @@ module DefaultRoleManager # provides a default implementation for the RoleManager interface class RoleManager < Rbac::RoleManager attr_accessor :all_roles, :max_hierarchy_level, :matching_func, :has_domain_pattern, :domain_matching_func - attr_reader :logger - def initialize(max_hierarchy_level, logger: Logger.new($stdout)) + def initialize(max_hierarchy_level) super() - @logger = logger @all_roles = {} @max_hierarchy_level = max_hierarchy_level end @@ -120,7 +118,7 @@ def get_users(name, *domain) def print_roles line = all_roles.map { |_key, role| role.to_string }.compact - logger.info(line.join(', ')) + Logger.info(line.join(', ')) end private diff --git a/lib/casbin-ruby/version.rb b/lib/casbin-ruby/version.rb index e88831b..90cd4a9 100644 --- a/lib/casbin-ruby/version.rb +++ b/lib/casbin-ruby/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module Casbin - VERSION = '1.0.10' + VERSION = '1.1.0' end From d802736de8145004307f68f12a5d6909328aa4ec Mon Sep 17 00:00:00 2001 From: Jokius Date: Thu, 9 Sep 2021 11:42:12 +0300 Subject: [PATCH 2/4] Add pre config --- lib/casbin-ruby.rb | 1 + lib/casbin-ruby/config.rb | 20 ++++++++++++++++++++ lib/casbin-ruby/core_enforcer.rb | 12 ++++++++---- lib/casbin-ruby/logger.rb | 11 ++++------- 4 files changed, 33 insertions(+), 11 deletions(-) create mode 100644 lib/casbin-ruby/config.rb diff --git a/lib/casbin-ruby.rb b/lib/casbin-ruby.rb index 84326d4..f91e009 100644 --- a/lib/casbin-ruby.rb +++ b/lib/casbin-ruby.rb @@ -4,6 +4,7 @@ module Casbin require 'casbin-ruby/version' require 'casbin-ruby/enforcer' require 'casbin-ruby/synced_enforcer' + require 'casbin-ruby/config' module Persist require 'casbin-ruby/persist/adapter' diff --git a/lib/casbin-ruby/config.rb b/lib/casbin-ruby/config.rb new file mode 100644 index 0000000..60a1ad3 --- /dev/null +++ b/lib/casbin-ruby/config.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +require 'logger' + +module Casbin + module Config + class << self + attr_writer :logger + attr_accessor :adapter, :model, :watcher + + def setup + yield self + end + + def logger + @logger ||= ::Logger.new($stdout, level: :error) + end + end + end +end diff --git a/lib/casbin-ruby/core_enforcer.rb b/lib/casbin-ruby/core_enforcer.rb index 6d9596e..3479029 100644 --- a/lib/casbin-ruby/core_enforcer.rb +++ b/lib/casbin-ruby/core_enforcer.rb @@ -10,13 +10,16 @@ require 'casbin-ruby/util/builtin_operators' require 'casbin-ruby/util/evaluator' require 'casbin-ruby/logger' +require 'casbin-ruby/config' module Casbin # CoreEnforcer defines the core functionality of an enforcer. # get_attr/set_attr methods is ported from Python as attr/attr= class CoreEnforcer - def initialize(model = nil, adapter = nil, logger: ::Logger.new($stdout), level: 'error') - Logger.register(logger, level) + def initialize(model = nil, adapter = nil, watcher = nil) + model ||= Config.model + adapter ||= Config.adapter + @watcher = watcher || Config.watcher if model.is_a? String if adapter.is_a? String @@ -31,8 +34,8 @@ def initialize(model = nil, adapter = nil, logger: ::Logger.new($stdout), level: end end - attr_accessor :adapter, :auto_build_role_links, :auto_save, :effector, :enabled, :watcher, :rm_map - attr_reader :model + attr_accessor :auto_build_role_links, :auto_save, :effector, :enabled, :rm_map + attr_reader :adapter, :model, :watcher # initializes an enforcer with a model file and a policy file. def init_with_file(model_path, policy_path) @@ -296,6 +299,7 @@ def enforce_ex(*rvals) private attr_accessor :matcher_map + attr_writer :adapter def init self.rm_map = {} diff --git a/lib/casbin-ruby/logger.rb b/lib/casbin-ruby/logger.rb index 85a8270..c9068f3 100644 --- a/lib/casbin-ruby/logger.rb +++ b/lib/casbin-ruby/logger.rb @@ -1,20 +1,17 @@ # frozen_string_literal: true +require 'casbin-ruby/config' + module Casbin module Logger module_function - def register(logger, level) - @logger = logger - @level = level - end - def info(value) - @logger.info(value) if @level == 'info' + Config.logger.info(value) end def error(value) - @logger.error(value) if @level == 'info' || @level == 'error' + Config.logger.error(value) end end end From 1515e395fef576999f0972a0be8477cdc49bb685 Mon Sep 17 00:00:00 2001 From: Jokius Date: Thu, 9 Sep 2021 11:47:49 +0300 Subject: [PATCH 3/4] Update doc --- README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7664b75..7ce3a7c 100644 --- a/README.md +++ b/README.md @@ -151,7 +151,20 @@ https://casbin.org/docs/en/tutorials 1. New a Casbin enforcer with a model file and a policy file: ```ruby -# TODO: correct `require` +require 'casbin-ruby' +Casbin::Config.setup do |config| + config.model = "path/to/model.conf" # default: nil + config.adapter = "path/to/policy.csv" # default: nil + config.watcher = Casbin::SomWatcher # default: nil + config.logger = Logger.new($stdout) # default: Logger.new($stdout, level: :error) +end + +enforcer = Casbin::Enforcer.new +``` + +OR + +```ruby require 'casbin-ruby' enforcer = Casbin::Enforcer.new("path/to/model.conf", "path/to/policy.csv") ``` From 67f644dc02ab5c086a86a1f3688b9f6e78e98134 Mon Sep 17 00:00:00 2001 From: Konayre Date: Thu, 9 Sep 2021 12:42:33 +0300 Subject: [PATCH 4/4] Update README.md Co-authored-by: Evgeniy Rashchepkin --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7ce3a7c..71ffa54 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,7 @@ require 'casbin-ruby' Casbin::Config.setup do |config| config.model = "path/to/model.conf" # default: nil config.adapter = "path/to/policy.csv" # default: nil - config.watcher = Casbin::SomWatcher # default: nil + config.watcher = Casbin::SomeWatcher # default: nil config.logger = Logger.new($stdout) # default: Logger.new($stdout, level: :error) end