IdentityToolbox

A IdentityToolBox é uma gem para realizar filtros nos dados de acordo com a permissão que o usuário possuí.

Instalação

Adicione essa linha em seu gem file:

gem 'identity_toolbox'

Execute:

$ bundle

Ou instale você mesmo.

$ gem install identity_toolbox

Configuração

Adicione no config/initializers/ o file identity_toolbox.rb para configurar as variáveis de ambiente.

IdentityToolbox.configure do |config|
  config.identity_service_url = ENV['identity_service_url']
  config.identity_cache_url = ENV['identity_cache_url']
end

Como Usuar

Policies

Crie a policy na pasta app/policies, com o nome baseado no modelo.

class ModelPolicy
  include IdentityToolbox::DefaultPolicy
end

Atributos de permissionamento

A gem possui os seguintes atributos que realizam a validação:

  • account_id
  • sinacor_advisor_id
  • client_id
  • identification_document

São atributos retornados do serviço de permissão do usuário.

Para adiciona-los basta incluir o metodo como o exemplo a seguir

Exemplo:

class ModelPolicy
  include IdentityToolbox::DefaultPolicy

   :sinacor_account_id
  client_id :client_id
end

Rotas fora dos padrões REST

A gem ja traz as rotas padrões como create, update, index, delete, show, com aplicação do filtro, não sendo necesário a criação desse métodos.

Se for necessário realizar os filtros em uma rota diferente do REST padrão, basta criar um alias por exemplo alias cancel? allowed? no caso para uma collection basta sobrescrever a class scope com o metodo resolve.

Exemplo

class ModelPolicy
  include IdentityToolbox::DefaultPolicy

   :sinacor_account

  alias cancel? allowed?

  class Scope
    def resolve
      scope.where(sinacor_account: )
    end
  end
end

A Gem disponibiliza os seguintes metodos que retornas o valores permitidos do usuário

  • account_ids
  • sinacor_advisor_ids
  • client_ids
  • identification_documents

Basta chama-los dentro da policy customizada que ela retornará os valores

Testes Policies

Para realizar teste nas policies, basta adicionar o shared example na pasta app/policies.

require 'rails_helper'

RSpec.describe ModelPolicy::Scope do
  it_behaves_like 'a default policy'
  it_behaves_like 'a default policy scope'
end

Controllers

Inclua em seu controller

include IdentityToolbox::Authorizable

Para realizar a autorização nos controllers apenas seguir o exemplo abaixo.

  • policy_scope ruby search = Model.ransack(params[:q]) result = policy_scope(search.result)
    • authorize ruby model = Model.find(params.require(:id)) authorize(model)

Exemplo inclusão em uma rota collection.

class ExampleController < ApplicationController
  include IdentityToolbox::Authorizable

  def index
    search = Example.ransack(params[:q])
    result = policy_scope(search.result)
    render_object(result)
  end
end

Testes

Para realizar os testes em suas policies, basta adicionar os shareds examples nas rotas na qual foi adicionado o authorize.

  • policy_scope
it_behaves_like 'an authorizable collection action' do
  after { get :index }
end
  • authorize
it_behaves_like 'an authorizable record action' do
  after { get :show, params: { id: id } }
end

Exemplo de um teste em uma collection.

Adicione a tag authorizable: true

 require 'rails_helper'

RSpec.describe ExampleController, type: :controller, authorizable: true do
 describe 'GET' do
    describe '#index' do
      it_behaves_like 'an authorizable collection action' do
        after { get :index }
      end
    end
  end
end

Entities

Caso possua alguma rota que retorne um Entity, ao invés do ActiveRecord, basta seguir o mesmo padrão anterior para modelos.

class EntityPolicy
  include IdentityToolbox::DefaultPolicy

  account_id :sinacor_account

  alias index? allowed?

  class Scope
    def resolve
      scope.select { |record| account_ids.include?(record.sinacor_account)
    end
  end
end

Teste de Aceitação com Turnip

A gem já vem implementado o step para adicionar caso o serviço esteja utilizando o turnip.

Configuração

No arquivo turnip_helper adicionar o seguinte include

RSpec.configure do |config|
  config.include IdentityToolbox::SpecSupport::AuthorizationSteps
end

Feature

Para isso basta adicionar o step com o nome do controller no background da feature

  And user is authorized on "Controller"

License

The gem is available as open source under the terms of the MIT License.