Autenticação Sinatra com Warden

Para aqueles projetos que não precisam de um grande poder atrás deles usando Rails, é uma idéia maravilhosa usar o Sinatra porque é leve e legal.

Sou novo, trabalho com Rails / Ruby / Sinatra (~ 1 ano atrás) e realmente não sei se existe algo que me ajude a iniciar um novo projeto com algumas coisas ou habilidades incluídas e não começar do zero, de qualquer maneira , Decido criar alguns repositórios para usar como início do projeto, vou explicar agora o que ele contém e se você achou útil, sinta-se à vontade para usar.

Etapas de configuração do diretor

Vou assumir que você já sabe instalar e usar o Sinatra e também tem conhecimento sobre Ruby.

Adicione a gema Warden referente ao seu GemFile

gem "warden", "1.2.1" 

Exigir protetor em seu arquivo de aplicativo

require "warden"

Warden usa Rack :: Flash e Rack: Sessão que devemos registrar

use Rack::Session::Cookie, secret: "IdoNotHaveAnySecret"
use
Rack::Flash, accessorize: [:error, :success]

Adicione a configuração do Warden ao arquivo do seu aplicativo

use Warden::Manager do |config|
# serialize user to session ->
config
.serialize_into_session{|user| user.id}
# serialize user from session <-
config
.serialize_from_session{|id| User.get(id) }
# configuring strategies
config
.scope_defaults :default,
strategies
: [:password],
action
: 'auth/unauthenticated'
config
.failure_app = self
end

Adicionar estratégias de guarda para: senha

 Warden::Strategies.add(:password) do
def flash
env
['x-rack.flash']
end

# valid params for authentication
def valid?
params
['user'] && params['user']['username'] && params['user']['password']
end

# authenticating user
def authenticate!
# find for user
user
= User.first(username: params['user']['username'])
if user.nil?
fail
!("Invalid username, doesn't exists!")
flash
.error = ""
elsif user.authenticate(params['user']['password'])
flash
.success = "Logged in"
success
!(user)
else
fail
!("There are errors, please try again")
end
end
end

Etapas de configuração de rota

A configuração da rota é a parte fácil, mas importante.

Rotas “obrigatórias” do diretor

# when user reach a protected route watched by Warden calls
post
'/auth/unauthenticated' do
session
[:return_to] = env['warden.options'][:attempted_path]
puts env
['warden.options'][:attempted_path]
flash
[:error] = env['warden'].message || 'You must to login to continue'
redirect
'/auth/login'
end

# to ensure user logout a session data removal
get
'/auth/logout' do
env
['warden'].raw_session.inspect
env
['warden'].logout
flash
[:success] = "Successfully logged out"
redirect
'/'
end

Rotas de aplicação

Para proteger um recurso é necessário apenas chamar o método Warden de autenticar!

get '/protected' do
env
['warden'].authenticate!
slim
:protected
end

Agora, toda vez que o usuário acertar / rota protegida sem autenticação, o Warden o enviará para o formulário de login.

Projeto Inicial

Se você quiser todas essas etapas pré-configuradas para usar como um ponto de partida em seu novo projeto, sinta-se à vontade para bifurcar o repositório e usá-lo

Este repo usa todos esses componentes

  1. Sinatra Link para Repo
  2. Warden Link para Repo
  3. Thin Link para Repo
  4. Link da Fundação 5 para Repo
  5. Link Slim para Repo
  6. Link Flash-Rack para Repo
  7. Link Sqlite3 para Repo

Fonte no GitHub

Qualquer comentário, sugestão ou correção é bem-vindo