Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

RailsでBasic認証の導入 〜完全版〜

More than 1 year has passed since last update.

最近、Railsで作っていたアプリにBasic認証を導入したのでその時のメモです。

そもそもBasic認証って何?

Basic認証とは、サーバーと通信する時にユーザー名とパスワードを知っている人じゃないと、そのサイトにアクセス出来ないようにするための機能です。
image.png

画像だとこんな感じですね。見たことある方いらっしゃると思います。では、実装していきます。

前提

  • アプリケーションサーバーはUnicornを使っているとする
  • WebサーバーはNginxを使っているとする
  • クラウドはAWSを使っているとする
  • Capistranoを用いて自動デプロイをしているとする

application_controllerにメソッドを書く

Basic認証は全てのコントローラで行いたいので、application_controller.rbにコードを書いていきます!
RailsにはBasic認証をするためのメソッドが用意されてるます。
それがauthenticate_or_request_with_http_basic
です!

app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :basic_auth
  protect_from_forgery with: :exception

  private

  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]
    end
  end
end

authenticate_or_request_with_http_basicはRailsで簡単にBasic認証を実装してくれるメソッドです!

username == ENV["BASIC_AUTH_USER"]
&&
password == ENV["BASIC_AUTH_PASSWORD"]

のところは環境変数にしてます。直接、username="kenji"とかコードに書いちゃうとGithubにミスってアップしちゃった時に確実に不正利用されます!気をつけて下さい!

ターミナルで、.bash_profileに環境変数を書く

今回は本番環境でやると仮定してます!
ssh接続してサーバーにアクセスして下さいね!

$ vim ~/.bash_profile

 ###「i」を押してインサートモードにいく

export BASIC_AUTH_USER='kenji'
export BASIC_AUTH_PASSWORD='1234'

 ###書き終えたらescキーを押して、「:wq」を押して保存して終了

$ source ~/.bash_profile
 ###最後に.bash_profileを読み込んで環境変数を反映させる

本番環境でのみBasic認証をするようにする

config/deployのproduction.rbに追記していきます。

config/deploy/production.rb
# server "db.example.com", user: "deploy", roles: %w{db}
server "(御自身のEC2のIPアドレス)", user: "ec2-user", roles: %w{app db web}

set :rails_env, "production"
set :unicorn_rack_env, "production"

# role-based syntax
# ==================

これでunicornが現在の環境を本番環境として認識するようになります。

さらにapplication_controllerの記述を変更する

app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :basic_auth, if: :production? 
  protect_from_forgery with: :exception

  private

  def production?
    Rails.env.production?
  end

  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]
    end
  end
end

追加したのは
before_action :basic_auth, if: :production?

def production?
Rails.env.production?
end
の二つだけです。

production?メソッドでRails.env.production?を定義しているので本番環境なのかローカルなのか分かるようになっています。

最後にデプロイして動作確認


$ bundle exec cap production deploy unicorn:stop


$ bundle exec cap production deploy unicorn:start

もし「え、うまくいかないんだけど、、、、、、、」ってなった場合は、一度AWSのコンソールからEC2を再起動して下さい!その後、nginx、MySQL、Unicornを手動で順番に再起動してください。それでうまくいくはずです。

お疲れ様でした!

しっかりBasic認証できてるはずです!

mitsumitsu1128
サウナサウナサウナサウナサウナ
qualiarts-inc
QualiArtsは皆様に長く愛されるエンターテイメントを提供するため、スマートフォンゲームの企画、開発、運営を行っております。
https://qualiarts.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away