非常に小さなWebアプリをASP.NET MVC 2からRuby/Sinatraに移植するのに忙しい。
MVCアプリでは、ユーザーのログインがデータベースに対して正しく検証されたときに、FormsAuthentication.SetAuthCookieが永続的なCookieを設定するために使用されていました。
Sinatraでフォーム認証に相当するものは何だろうと思っていましたか?すべての認証フレームワークは非常に大きく見え、私が探しているものではありません。
以下は、Sinatraの非常に単純な認証スキームです。
以下でその仕組みを説明します。
class App < Sinatra::Base
set :sessions => true
register do
def auth (type)
condition do
redirect "/login" unless send("is_#{type}?")
end
end
end
helpers do
def is_user?
@user != nil
end
end
before do
@user = User.get(session[:user_id])
end
get "/" do
"Hello, anonymous."
end
get "/protected", :auth => :user do
"Hello, #{@user.name}."
end
post "/login" do
session[:user_id] = User.authenticate(params).id
end
get "/logout" do
session[:user_id] = nil
end
end
保護するルートについては、上記の:auth => :user
の例のように、/protected
条件をルートに追加します。これはauth
メソッドを呼び出し、condition
経由のルートに条件を追加します。
条件は、ヘルパーとして定義されているis_user?
メソッドを呼び出します。このメソッドは、セッションに有効なアカウントIDが含まれているかどうかに応じて、trueまたはfalseを返します。 (このように動的にヘルパーを呼び出すと、異なる権限を持つ他のタイプのユーザーを簡単に追加できます。)
最後に、before
ハンドラは、各ページの上部にユーザーの名前を表示するなど、すべてのリクエストに対して@user
インスタンス変数を設定します。ビューでis_user?
ヘルパーを使用して、ユーザーがログインしているかどうかを確認することもできます。
トッドの答えは私にとってはうまくいきません、そして私は SinatraのFAQ :
require 'rubygems'
require 'sinatra'
use Rack::Auth::Basic, "Restricted Area" do |username, password|
[username, password] == ['admin', 'admin']
end
get '/' do
"You're welcome"
end
誰かがこの質問をさまよって、非永続的なソリューションが必要になった場合に備えて、私はそれを共有すると思いました。
私は完全な例を含むこのチュートリアルとリポジトリを見つけました、それは私にとってうまくいきます
私は、ユーザー用と管理者用の2つのパスワードが設定されたアプリに、承認された回答を使用しました。パスワード(またはピン)を使用するログインフォームを作成し、それをシナトラの設定で設定したもの(管理者用、ユーザー用)と比較しました。次に、ユーザーが入力し、それに応じて承認したパスワードに応じて、session [:current_user]をadminまたはuserに設定します。ユーザーモデルも必要ありませんでした。私はこのようなことをしなければなりませんでした:
use Rack::Session::Cookie, :key => 'rack.session',
:domain => 'foo.com',
:path => '/',
:expire_after => 2592000, # In seconds
:secret => 'change_me'
sinatraのドキュメント で述べたように、セッションをChromeに永続化します。これをメインファイルに追加すると、期待どおりに保持されます。