CanCanCan
O que é
Biblioteca de autorização pra Rails — define o que um usuário pode
fazer através de uma classe Ability, e expõe authorize! (bloqueia se
não puder) e accessible_by (filtra uma query só pro que o usuário pode
ver).
Por que essa
A biblioteca de autorização mais madura do ecossistema Rails, mas o que
realmente importa aqui não é a lib em si — é como este projeto a usa:
Ability não hardcoda can :manage, Model por model, calcula em
runtime a partir de papel/permissão cadastrados no banco. Ver
Autorização pro funcionamento
completo (cálculo de permissão, escopo por tenant, verbo em português).
Versão
cancancan (3.6.1) — Gemfile.lock.
Como importar
# Gemfile
gem "cancancan"
# app/controllers/application_controller.rb
def current_ability
@current_ability ||= Ability.new(current_user)
end
Exemplo real
Uso num controller (app/controllers/api/v1/admin/a_papeis_controller.rb):
def index
authorize! :CONSULTAR, APapel
scope = APapel::List.new(params: params, ability: current_ability).call
render_paginated_result(scope, success_message: "Papeis listados com sucesso")
end
Onde usar no projeto
authorize! em todo controller admin, antes de qualquer leitura/escrita;
accessible_by(ability) em todo */list.rb (ver
Filtros e busca).
CanCan::AccessDenied (quando authorize! nega) é capturado pelo
mapa central de erro,
vira 403 no envelope padrão — nenhum controller trata essa exceção à
mão.
