2018年4月29日日曜日

Sinatra にベーシック認証を追加してみる

概要

Rack の機能を使って Sinatra でベーシック認証を発動させることができるようなので試してみました
Siantra だけでもベーシック認証が使えるので nginx などリバースプロキシが不要になります

環境

  • macOS 10.13.4
  • Ruby 2.4.1p111
  • sinatra 2.0.1

アプリ側でベーシック認証させるページを指定する

  • vim app.rb
class AdminPage < Sinatra::Base
  set :show_exceptions, false

  use Rack::Auth::Basic, "Are you Admin?" do |username, password|
    username == 'admin' && password == 'password'
  end

  get '/' do
    'ok'
  end
end

アプリ側でベーシック認証させないページを指定する

  • vim app.rb
class HomePage < Sinatra::Base
  set :show_exceptions, false

  get '/' do
    'ok'
  end
end

config.ru にルーティングを定義する

  • vim config.ru
require './app.rb'

run Rack::URLMap.new({
  "/" => HomePage,
  "/admin" => AdminPage
})

Rack::URLMap クラスを生成するときにルーティングのハッシュ情報を定義します
先ほど定義したクラスを値に指定しましょう

これでどうなるか

  • / には認証なしでアクセスできます
  • /admin にはベーシック認証が発動し認証に成功しないとアクセスできません

ちなみに /admin/hoge にアクセスしようとしてもベーシック認証が発動するのでサブディレクトリにも効いているようです

config.ru でトップディレクトリを指定するので、アプリ側で定義したルーティングはサブディレクトリになります

別のユーザを追加したい場合は認証の条件をハッシュなどにすれば OK です
別のページにもベーシック認証を追加したい場合は同じようにクラスを追加し、config.ru にルーティングを追加してあげましょう

最後に

Sinatra でベーシック認証を有効にする方法を紹介しました
認証に失敗した場合は真っ白なページが表示されます

認証ごとに Sinatra::Base を継承した class を作成する必要があるので not_founderror などは各クラス内でちゃんと定義してあげる必要があります

参考サイト

0 件のコメント:

コメントを投稿