railsでbasic認証を使う
Webサービスを作っていると、とりあえずbasic認証しとこうかな、なんて思うことがよくあります。
たとえば、機能はほぼできているんだけどまだ公開前だから軽く認証かけておいて関係者のみ見れるようにしたい、とか特典情報を載せたいけどそこまでシビアにガードしなくていいから軽く認証しておきたいとかのような場合です。
railsだと以下のように簡単にできちゃいます。
app/application_controller.rb
に以下のようにメソッドを追加しましょう。
def authenticate_by_basic
authenticate_or_request_with_http_basic do |username, password|
username == ENV['BASIC_USERNAME'] && password == ENV['BASIC_PASSWORD']
end
end
authenticate_or_request_with_http_basic
メソッドはbasic認証で受け取ったユーザーネームとパスワードをブロックから受け取ることができます。
あとは、これをこちらが設定している認証情報を突き合わせをして、OKならtrueを返すようにします。
この例では環境変数に設定したENV['BASIC_USERNAME']
とENV['BASIC_PASSWORD']
との突き合わせをしています。
これは他にもconfig/credentials
とかその辺に入れたものでもいいですね。
ソースコードの中に書き込むのはbasic認証とはいえ、万が一ソースが流出した場合に備えてやめておいた方がいいでしょう。
あとはこのメソッドを利用するコントローラーでbefore_action
とか使って呼び出せばOKですね。
たとえば、app/sample_controller.rb
に設定したい場合は以下のように書くことになるでしょう。
class SamplesController < ApplicationController
before_action :authenticate_by_basic
# 以下略
end
もし、アプリケーション全体にbasic認証を仕掛けたい場合はApplicationController
でbefore_actionするとよいと思います。
ローカルの開発環境でdotenv-rails
のGemを使っているなら、.env
に以下のように認証情報を書く感じ。
さすがに、この認証情報だとゆるすぎるので、もっと複雑にしとくといいとです。
BASIC_USERNAME=user
BASIC_PASSWORD=1234
または、ローカルではbasic認証をスキップしたい、なんてときは先ほどの認証用メソッドに以下のように追加する、というのもよくやりますね。
def authenticate_by_basic
return if Rails.env.development? # 追加
authenticate_or_request_with_http_basic do |username, password|
username == ENV['BASIC_USERNAME'] && password == ENV['BASIC_PASSWORD']
end
end
自分はページに認証をかけるときは万が一に備えてnoindex nofollow
を設定しておくことが多いです。
この記事の環境情報
- rails 7.0.4
- HTMLメールを書いた次の日の朝
railsに関する他の記事を読む
- omniauth-google-oauth2でscopeを追加するときはemailが必須だった
- google-api-clientを指定してinstallするのはもう非推奨になっていた
- OmniAuthでdeveloper providerを使ってダミーログインをする
- [Rails]取得したクラス名をキャメルケースからスネークケースに変換する
- urlヘルパーをモデルなどでも使う方法
最近の記事を読む
- Flutterでcontextを使わずにlocale情報を取得する
- Cloud RunでIAPを有効にしようとしてハマったこと
- slimでtype='application/ld+json'のscriptタグを書く
- タグマネージャーでjsのloadイベントを発火させたいとき
- mysqlコマンドを実行してERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)と言われたら