web-dev-qa-db-ja.com

Sinatra / Rackの非常にシンプルな認証スキームとは

非常に小さなWebアプリをASP.NET MVC 2からRuby/Sinatraに移植するのに忙しい。

MVCアプリでは、ユーザーのログインがデータベースに対して正しく検証されたときに、FormsAuthentication.SetAuthCookieが永続的なCookieを設定するために使用されていました。

Sinatraでフォーム認証に相当するものは何だろうと思っていましたか?すべての認証フレームワークは非常に大きく見え、私が探しているものではありません。

38
AndrewVos

以下は、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?ヘルパーを使用して、ユーザーがログインしているかどうかを確認することもできます。

76
Todd Yandell

トッドの答えは私にとってはうまくいきません、そして私は 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

誰かがこの質問をさまよって、非永続的なソリューションが必要になった場合に備えて、私はそれを共有すると思いました。

30
Ralphleon

私は完全な例を含むこのチュートリアルとリポジトリを見つけました、それは私にとってうまくいきます

https://sklise.com/2013/03/08/sinatra-warden-auth/

https://github.com/sklise/sinatra-warden-example

7
user9869932

私は、ユーザー用と管理者用の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に永続化します。これをメインファイルに追加すると、期待どおりに保持されます。

1
Josh Hunter