Sha256: 5740bfd276f5368bcc28f6b75861d4d1f993327b1dded179bd31b04f3698c1fb

Contents?: true

Size: 1.82 KB

Versions: 13

Compression:

Stored size: 1.82 KB

Contents

# See the README

module OpenStax
  module Utilities
    class AccessPolicy
      include Singleton

      attr_reader :resource_policy_map

      def initialize()
        @resource_policy_map = {}
      end

      def self.method_missing(method_name, *arguments, &block)
        if method_name.to_s =~ /(.*)_allowed?/
          action_allowed?(*arguments.unshift($1.to_sym), &block)
        else
          super
        end
      end

      def self.respond_to_missing?(method_name, include_private = false)
        method_name.to_s.end_with?('_allowed?') || super
      end

      def self.require_action_allowed!(action, requestor, resource)
        msg = "\"#{requestor.inspect}\" is not allowed to perform \"#{action}\" on \"#{resource.inspect}\""
        raise(SecurityTransgression, msg) unless action_allowed?(action, requestor, resource)
      end

      def self.action_allowed?(action, requestor, resource)

        # If the incoming requestor is an ApiUser, choose to use either its
        # human_user or its application.  If there is a human user involved, it
        # should always take precedence when testing for access.
        if defined?(OpenStax::Api::ApiUser) &&
           requestor.is_a?(OpenStax::Api::ApiUser)
          requestor = requestor.human_user ? requestor.human_user : requestor.application
        end

        resource_class = resource.is_a?(Class) ? resource : resource.class
        policy_class = instance.resource_policy_map[resource_class.to_s].try(:constantize)

        # If there is no policy registered, we by default deny access
        return false if policy_class.nil?

        policy_class.action_allowed?(action, requestor, resource)
      end

      def self.register(resource_class, policy_class)
        self.instance.resource_policy_map[resource_class.to_s] = policy_class.to_s
      end

    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
openstax_utilities-5.1.2 lib/openstax/utilities/access_policy.rb
openstax_utilities-5.1.1 lib/openstax/utilities/access_policy.rb
openstax_utilities-5.1.0 lib/openstax/utilities/access_policy.rb
openstax_utilities-5.0.0 lib/openstax/utilities/access_policy.rb
openstax_utilities-4.5.2 lib/openstax/utilities/access_policy.rb
openstax_utilities-4.5.1 lib/openstax/utilities/access_policy.rb
openstax_utilities-4.5.0 lib/openstax/utilities/access_policy.rb
openstax_utilities-4.4.2 lib/openstax/utilities/access_policy.rb
openstax_utilities-4.4.1 lib/openstax/utilities/access_policy.rb
openstax_utilities-4.4.0 lib/openstax/utilities/access_policy.rb
openstax_utilities-4.3.0 lib/openstax/utilities/access_policy.rb
openstax_utilities-4.2.3 lib/openstax/utilities/access_policy.rb
openstax_utilities-4.2.2 lib/openstax/utilities/access_policy.rb