Controle de Acesso
Publicado por Marcos Tapajós há aproximadamente 1 ano.
Recentemente um cliente da Improve it me perguntou se existe algum plugin para fazer controle de acesso em Ruby on Rails e como eu não conhecia nenhum iniciei uma processo de pesquisa e experimentos com alguns plugins que eu encontrei.
Antes de continuar falando em controle de acesso acho importante explicar a diferença entre Autenticação e Autorização já que normalmente eu vejo nas listas de Rails as pessoas confundirem esses conceitos.
Autenticação:
"Autenticação (do grego : αυθεντικός = real ou genuíno, de 'authentes' = autor) é o ato de estabelecer ou confirmar algo (ou alguém) como autêntico, isto é, que reivindica a autoria ou a veracidade de alguma coisa. A autenticação também remete à confirmação da procedência de um objeto ou pessoa, neste caso, frequentemente relacionada com a verificação da sua identidade."(wikipedia)
Quando se fala em Autenticação, em Ruby on Rails, uma unanimidade é o plugin Restful Authentication. Trata-se de um excelente plugin e acredito que no que diz respeito a autenticação o problema foi bem resolvido por ele.
Autorização:
"Autorização, em segurança da informação, é o mecanismo responsável por garantir que apenas usuários autorizados consumam os recursos protegidos de um sistema computacional. Os recursos incluem arquivos, programas de computador, dispositivos de hardware e funcionalidades disponibilizadas por aplicações instaladas em um sistema. Podem ser considerados consumidores de recursos, as pessoas que utilizam um sistema através de uma interface, programas e outros dispositivos de um computador.
O processo de autorização decide se uma pessoa, programa ou dispositivo X tem permissão para acessar determinado dado, programa de computador ou serviço Y." (wikipedia)
Com essa diferença esclarecida vou falar um pouco sobre os plugins de autorização que eu considerei mais interessantes.
Um plugin de autorização é bem mais difícil de se implementar pois normalmente cada aplicação necessita de uma forma de controle de acesso diferente e personalizável.
Os plugins:
Vale lembrar que nossa necessidade era de autorização baseada em controle de acesso(RBAC).
1. Acl System:
O Acl System é um plugin bem simples, com pouco código e que baseia em um relacionamento has_and_belongs_to_many entre os modelos User e Role.
User <= habtm => Role
Seu uso é bem simples e não pretendo entrar em maiores detalhes já que está tudo explicado na documentação. Vou apenas mostrar um pequeno exemplo e comentar alguns pontos interessantes.
class PostController < ApplicationController
before_filter :login_required, :except => [:list, :index]
access_control [:new, :create, :update, :edit] => '(admin | user | moderator)',
:delete => 'admin & (!moderator & !blacklist)'
A implementação do método access_control busca os papeis de um usuário através da chamada current_user.roles. Essa implementação é bem interessante pelo fato de usar o método current_user para obter o usuário autenticado, tornando esse plugin compatível com o uso do Restful Authentication.
O ponto negativo é que a implementação do método access_control não permite aumentar a granularidade dando permissões específicas a um usuário sem precisar criar um novo papel com apenas essa permissão. Isso se dá ao fato dele ser "RBAC schema level 1".
Acredito que para muitos casos essa implementação é mais do que suficiente e o plugin funciona muito bem. Só não faço mais nenhum elogio a ele pois sua base de testes é ínfima.
2. Active RBAC:
O Active RBAC é bem mais complexo que o Acl System e seu entendimento não é a coisa mais simples do mundo. Esse plugin é bem completo e implementa o "RBAC schema level 2".

Novamente eu não vou entrar em detalhes do seu uso pois existe uma página explicando isso. Vou apenas fazer alguns comentários.
Como eu disse anteriormente, esse plugin é bem completo só eu considero completo demais! Ele implementa uma autenticação bem parecida com a do acts_as_authenticated, que já não é mais usado.
Na minha opinião esse é um dos pontos fracos desse plugin, já que o Restful Authentication trata a autenticação de uma forma bem melhor. Isso não quer dizer que ele é incompatível com o Restful Authentication, mas que me deu um pouco mais de trabalho para usar.
A documentação dos conceitos é bem feita, porém ele peca pela falta de exemplos na hora de detalhar como se usa. Definitivamente ele seria bem mais fácil de usar se tivesse uma documentação mais detalhada.
O plugin trabalha como uma espécie de módulos e isso permite que você utilize mesmo sem seguir os nomes de tabela que ele sugere. Esse é um ponto positivo pois ele é bem flexível tanto na parte dos modelos quanto na hora de checar as permissões nos controladores.
A parte ruim desses módulos é que algumas coisas não muito intuitivas e a falta de documentação torna seu entendimento bem complexo.
Ele tem um gerador para auxiliar o seu uso mas que é MUITO mal feito! Ele copia alguns arquivos e isso pode fazer o seu projeto parar de funcionar. Sem contar o fato dele copiar algumas migrations e não coloca-las com a numeração correta.
Segundo a documentação do Active RBAC ele está sendo reinscrito porém o SVN dele está sem modificações por mais de um ano. Isso me leva a suspeitar que ele foi abandonado.
Resumo
Ambos os plugins são bons, tem pontos positivos e pontos negativos mas não consigo considerar nenhum dos dois como uma solução definitiva para o problema da autorização. Infelizmente não consegui achar nenhum outro plugin melhor do que esses e resolvi partir para modificar o Active RBAC para resolver o cliente precisava usando o Restful Authentication. Gostaria de saber se alguém conhece algum outro plugin que seja bom.
Desde sexta feira ando pensando na possibilidade de fazer o meu próprio plugin para resolver esse problema só de uma certa forma seria reinventar a roda já que existem esses outros. Mas ao mesmo tempo eles não são perfeitos, então pensei em pegar o mais completo deles e fazer um fork.
Infelizmente não terei tempo para me dedicar sozinho a esse plugin já que eu estou envolvido em vários. Um dos motivos desse post é recrutar um time para desenvolver esse plugin junto comigo. Como eu sou uma pessoa muito chata eu tenho algumas exigências com relação ao plugin e não abro mão de nenhuma delas.
O plugin deve ter testes para TUDO.
Todo o código e a documentação deve ser em inglês já que será um plugin para uso global. Isso não impede uma documentação em português.
A documentação deverá ser bem detalhada e com muitos exemplos.
Vamos seguir o K.I.S.S.
Se você acredita na minha ideia, e concorda com as minhas exigências, entre em contato comigo.



O que você achou? Coloque seus comentários e sugestões abaixo!
Acompanhe o RSS dessa página.
Comentários (9 até o momento)
Celestino Gomes disse aproximadamente 3 horas depois:
Marcus Derencius disse aproximadamente 11 horas depois:
Ozéias Sant'ana disse aproximadamente 13 horas depois:
Eduardo Fiorezi disse aproximadamente 14 horas depois:
Alisson disse aproximadamente 20 horas depois:
Bueno disse 1 dia depois:
Everton J. Carpes disse 7 dias depois:
Tapajós disse 10 dias depois:
Guilherme disse aproximadamente 1 ano depois: