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