Back-End

30 mai, 2014

Aprenda a implementar uma Basic Authentication com Rails

Publicidade

Por vários motivos você pode querer implementar algum tipo de autenticação na sua aplicação Rails. Seja por que o produto que você está trabalhando ainda não deve ser mostrado para o público em geral, ou seja porque este é apenas um ambiente de desenvolvimento e as novas features ainda estão em fase de desenvolvimento.

Ou até mesmo o acesso a este ambiente é restrito a apenas alguns usuários, como por exemplo uma área administrativa. Muito embora para esta última alternativas exista outras opções muito mais interessantes, como por exemplo o Devise.

Aqui vou mostrar uma maneira bastante simples, mas ainda assim bastante usual para implementar uma “Basic Authentication”. Essa implementação pode acontecer em duas frentes: Nginx ou Apache ou direto na aplicação Rails. A segunda frente é a que vou cobrir neste artigo.

Como qualquer outra autenticação, a operação básica é fechar recursos para pessoas não autorizadas. A autorização a estes recursos – URLs – são liberadas desde que um username e senha seja conhecida pela aplicação.

Com Rails o processo é bastante simples:

  • Implemente um metodo que será executado através do filtro: before_filter para todos os métodos do controller
  • Defina este método no before_filter

Este é um exemplo de como o método a ser executado deve se parecer. Repare no método especial do Rails simpaticamente chamado de authenticate_or_request_with_http_basic:

class SecureApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  
  before_filter :authentication

  protected

  def authentication
    authenticate_or_request_with_http_basic do |username, password|
      username == "usuario" && password == "senha"
    end
  end

end

Para ver este código em ação, basta você trocar a ApplicationController nos seus controllers pela SecureApplicationController.

Você pode deixar esta autenticação bastante sofisticada, por exemplo, implementando os usuários e senhas em uma base de dados. Outro ponto é se você precisar saber quem é o usuário autenticado. O Rails possui um outro método que pode ser chamado de dentro do seu controller bastante simpático, que retorna duas variáveis: username e senha do usuário autenticado no momento:

@username, @senha = ActionController::HttpAuthentication::Basic::user_name_and_password(request)

O código completo desta aplicação e seu comportamento você pode obter através do meu Github: https://github.com/mangar/rails_basic_authentication