Devise & CanCanCan

Gerenciamento de permissões no Ruby on Rails

Rafael Medeiros
Jaguaribe Tech
4 min readAug 11, 2017

--

Introdução

Grande parte das aplicações Web hoje em dia utilizam de gerenciamento de permissões para ter diferentes níveis de acesso a determinadas funcionalidades ou visualizações em uma aplicação, baseados em seus tipos de usuário.

Por exemplo, imagine que em um sistema exista um botão de excluir todos os registros do banco de dados de uma vez, seria muito interessante que apenas o usuário administrador do sistema tivesse acesso a este botão, não é mesmo?

Por este motivo fazemos um gerenciamento de permissões para tratar questões como essas, neste artigo, utilizaremos exemplo de uso de duas gems no rails para facilitar este processo, que serão o Devise e o CanCanCan.

O uso da gem Devise tem como finalidade gerar para você o login e sign up da sua aplicação. Já a CanCanCan ajuda a gerenciar permissões para tipos de usuários.

Configurando o Ambiente

Para melhor aprendizado vamos criar um exemplo com um passo a passo de como trabalhar com estas gems.

Primeiro, acesse o seu arquivo no projeto chamado GemFile, agora adicione em seu conteúdo o seguinte:

Feito isso, é necessário que você execute o comando bundle na pasta do seu projeto para que se instale as gems adicionadas.

Instale o devise com o comando:

Para criar a estrutura necessária de um usuário execute o seguinte comando:

Instale o devise no model user :

Lembre-se de rodar as migrações :

Adicione a validação no arquivo app/controllers/application_controller.rb :

Isto fará com que o usuário seja obrigado a estar logado para ter acesso as telas da aplicação.

Para incluir as autorizações é necessário gerar o arquivo ability. Execute o comando :

Alguns possíveis casos de uso dessas gems

Após ter gerado todas as configurações e gerar os arquivos necessários, agora podemos finalmente modificar as permissões do nosso sistema. No arquivo Ability você pode adicionar algo relacionado a isto:

O método initialize recebe como parâmetro um current_user, que nada mais é que o usuário que está logado no sistema. A lógica deste código se baseia em que se o usuário logado no sistema for admin ele pode fazer qualquer alteração no site. Caso não seja, e dando como exemplo uma classe qualquer que chamo de Livro, ele pode ler, atualizar e deletar em telas relacionadas a livro, já as de User, ele terá permissão apenas de ler.

A propriedade :manage dá permissão que ele faça qualquer uma das 4 operações de CRUD que são: Create, Read, Update, e Destroy. Já a propriedade :all é relacionada aos models, ele poderá fazer fazer tal ação em qualquer model do sistema.

Caso você prefira desta forma:

o método utilizado load_and_authorize_resource serve para permitir que todos os métodos do seu controller tenham permissão de acesso.

Você também pode precisar que um botão só apareça em determinados momentos do seu sistema, para isto podemos usar:

A leitura deste código se baseia em caso o usuário tenha permissão de :create do model livro, ou seja, se um usuário pode criar um livro ele mostra o botão de Cadastrar Livro, caso não possa, o botão será omitido.

Caso a autorização falhe, uma página de error provida do CanCanCan é exibida. Você pode personalizar isto da maneira que quiser usando o CanCan::AcessDenied

Neste trecho de código mostro como seria para redirecionar para uma página de error criada e gerenciada por você.

Com isso, já podemos fazer maior parte das tarefas que o gerenciamento de permissões exige, para saber mais detalhes sobre a gem CanCanCan, clique aqui.

Considerações Finais

Usando o CanCanCan e o Devise você consegue em poucos minutos criar um sistema de alta qualidade para gerenciar a autenticação(devise) e a autorização(CanCanCan) de usuários do seu sistema. Um ponto que pode ser considerado negativo no uso da gem de autorizações, é que ela não funciona bem sem o auxílio de uma gem para login como utilizamos no post o Devise, porque precisamos ter um usuário logado no sistema.

Linkedin: rafael-medeiros-pb

--

--