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
account_id :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
account_id :sinacor_account
alias cancel? allowed?
class Scope
def resolve
scope.where(sinacor_account: account_ids)
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)
- authorize
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 on "Controller"
License
The gem is available as open source under the terms of the MIT License.