LoginSignup
61
62

More than 5 years have passed since last update.

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

Posted at

最近、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認証できてるはずです!

61
62
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
61
62