contato@koshtech.com +55 21 98038-2606

Authlogic + CanCan no Rails 3: Autenticação e autorização de usuários - Parte 2

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    

end

Desse 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.