Nesse segundo post sobre autenticação e autorização de usuários falaremos sobre autorização utilizando a gem Cancan desenvolvida por Ryan Bates (https://github.com/ryanb/cancan).
Nesse segundo post sobre autenticação e autorização de usuários falaremos sobre autorização utilizando a gem Cancan desenvolvida por Ryan Bates (https://github.com/ryanb/cancan). Tendo como base uma aplicação que se deseje aplicar permissionamento com um scaffold simples de Posts e mais as modificações feitas nas parte 1, siga os seguintes passos para entender o funcionamento da gem Cancan e como aplica-la em um projeto.
Para adicionar a gem Cancan adicione ao seu Gemfile a linha abaixo e rode o comando bundle no terminal.
gem 'cancan'
Adicione o modelo Ability com o seguinte código:
class Ability include CanCan::Ability def initialize(user) end end
No método initialize, user será passado como parâmetro e dentro do método serão definidas as permissões associadas ao Post de acordo com o role do usuário. Crie uma migração para adicionar a coluna role ao User. No código abaixo foram definidos dois roles para o usuário (admin e moderator) e permissões para os mesmos gerenciarem, atualizarem e lerem os posts.
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.role == "admin"
can :manage, Post
elsif user.role == "moderator"
can :update, Post
can :read, Post
else
can :read, Post
end
end
endDesse modo, já podemos adicionar condições à view de acordo com as permissões dos usuários.
<% if can? :update, @post %> <%= link_to 'Edit', edit_post_path(@post) %> | <% end %> <% if can? :destroy, @post %> <%= link_to 'Destroy', post_path(@post), :method => :delete %> | <% end %>
Para que o usuário não tenha acesso à uma página que ele não tenha permissão para entrar através da url, adicione ao controller o seguinte método:
load_and_authorize_resource
Para adicionar uma notificação na tela, que será ativada se o usuário não tiver permissão de acesso em uma página, adicione o seguinte código no arquivo app/controllers/application_controller.rb.
rescue_from CanCan::AccessDenied do |exception| flash[:notice] = "Access denied!" redirect_to root_url end
Seguindo esses passos e mais algumas modificações de acordo com o objetivo da sua aplicação pode-se implementar as permissões necessárias para seu projeto.
