Sha256: 70c2738c18f645705d79fb775a5fd77d3b3988cb0f366ea09859b241daa77006

Contents?: true

Size: 1.7 KB

Versions: 23

Compression:

Stored size: 1.7 KB

Contents

# frozen_string_literal: true

require 'singleton'

module AuthorizationPlugin
  include Praxis::PluginConcern

  class Plugin < Praxis::Plugin
    include Singleton

    def config_key
      :authorization
    end

    def initialize
      super
      @options = { config_file: 'config/authorization.yml' }
    end

    def prepare_config!(node)
      node.attributes do
        attribute :default_abilities, Attributor::Collection
      end
    end

    def default_abilities
      config.default_abilities
    end

    def authorized?(request)
      abilities = default_abilities.clone
      abilities |= request.user_abilities

      (request.action.required_abilities - abilities).empty?
    end
  end

  module Request
    def user_abilities
      []
    end
  end

  module Controller
    extend ActiveSupport::Concern

    included do
      before :action do |controller|
        verify_abilities(controller.request)
      end
    end

    module ClassMethods
      def verify_abilities(request)
        return true unless request.action.required_abilities

        authorized = AuthorizationPlugin::Plugin.instance.authorized?(request)

        return Praxis::Responses::Forbidden.new unless authorized
      end
    end

    def subject
      # p [self, :subject]
    end
  end

  module EndpointDefinition
  end

  module ActionDefinition
    extend ActiveSupport::Concern

    included do
      attr_accessor :required_abilities

      decorate_docs do |action, docs|
        docs[:required_abilities] = action.required_abilities
      end
    end

    def requires_ability(ability)
      @required_abilities ||= []
      @required_abilities << ability

      response :forbidden
      requires_authentication true
    end
  end
end

Version data entries

23 entries across 23 versions & 1 rubygems

Version Path
praxis-2.0.0 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.40 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.39 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.38 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.37 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.36 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.35 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.34 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.33 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.32 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.31 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.30 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.29 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.28 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.27 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.26 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.25 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.24 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.23 spec/support/spec_authorization_plugin.rb
praxis-2.0.pre.22 spec/support/spec_authorization_plugin.rb