homeASCIIcasts

20: Restrigindo acesso 

(view original Railscast)

Other translations: En It Es

Other formats:

Written by Gabriel Feitosa Vilar (cogumm.net)

Restrigindo acesso

No último episódio, criamos links para criar, editar e apagar episódios no site ASCIIcasts. Os links funcionam, mas, um pouco bem demais, pois podem ser clicados por quem visita o site.

A página de listas de epsódios, com os links de admini visível para todos os usuários.

O que temos que fazer é restringir os links somente para aqueles usuários que têm permissão para editar os episódios. Vamos editar o nosso episódio parcial apenas para renderiza a edição e destruição dos links se um método chamado for admin? retornar verdadeiro. (Nós vamos fazer o mesmo com o novo link, mas não mostra o código aqui.)

<li>
  <p class="episodeId"><%= episode.episode_id %></p>
  <h3><%= link_to episode.title, episode_path(episode.identifier) %></h3>
  <p class="summary"><%= episode.summary %></p>
  <p class="tagList">
    Tags: <% episode.tags.each do |tag| %><%= link_to tag.title, tag_path(tag.title) %><% end %>
  </p>
  <% if admin? %>
  <p class="adminActions">
    <%= link_to "Edit", edit_episode_path(episode) %>
    <%= link_to "Destroy", episode_path(episode), :confirm => "Are you sure?", :method => :delete %>
  </p>
  <% end %>
</li>

O episódio com os parciais admin? verificar o envolvimento de edição e destruir dos links.

Em seguida, precisamos escrever o método admin?, mas onde ela deve ir? Como estamos chamando o método de uma view, o local imediatamente óbvio está no arquivo application helper, mas gostaríamos que ele fosse disponível nos controllers também, então vamos colocar no application controller em vez disso.

class ApplicationController < ActionController::Base
  helper_method :admin?  
  protected
  def admin?
    false
  end  
end

O método admin? adicionado ao ApplicationController.

Por enquanto, o nosso método admin?, irá retornar falso, (iremos aplicar totalmente no próximo episódio). Como também queremos usá-lo em nossas views, temos que utilizado o método helper_method para torna disponível a partir do código da view.

Quase acabando

Agora nós temos que escrever nosso método admin?, nossos links são escondidas dos usuários não-administrador. Há ainda um problema embora: alguém ainda pode visitar as páginas de administração direta e adicionar ou editar episódios dessa maneira. Podemos consertar isso usando um before_filter.

class EpisodesController < ApplicationController
  before_filter :authorize, :except => [:index, :show ]
  
  def index
    @episodes = Episode.find(:all)
  end
  # show, new, create, edit, update and destroy methods hidden.
end

No controlador de episódios (com o método bodies removido).

O before_filter acima irá executar um método chamado authorize antes de qualquer método em nosso controlador é chamado, exceto para os métodos de index e show. Agora é necessário escrever o método authorize. Vamos colocá-lo no application controller, para que ele esteja disponível para todos os controladores.

class ApplicationController < ActionController::Base
  helper_method :admin?  
  protected
  def admin?
    false
  end  

  def authorize
    unless admin?
      flash[:error] = “Unauthorized access”
      redirect_to home_path
      false
    end
  end
end

No ApplicationController, foi dicionado o método authorize.

O método verifica se o usuário é um administrador, se não, mostra um método flash e redireciona para a página inicial. Por último ele retornará falso, para que nenhuma outra ação é executada. Agora, se tentarmos visitar a página do novo episódio seremos redirecionados para a página inicial. Como alternativa, se não quiser que os usuários não autorizados saibam que a página existe poderíamos jogar um erro 404 (página não encontrada) no lugar.

#TODO:

Nosso sistema de administração está quase lá, mas ainda necessitamos implementar o método admin?. Iremos mostrar para você como fazer isso no próximo episódio.