#ログインしていないユーザーがログインできてしまう
ログイン機能を実装したもののログインをしていないと使えない機能でも直接urlからアクセスすると使えてしまう。
この状況は非常にまずい。
ってことで調べた。
#before_actionを使う
この機能を実装するためにはbefore_actionを使えばok
before_actionとはまあ書いて字のごとくなんだけどアクションが実行される前に実行されるもの。
字でつらつら書くのはわかりづらいと思うので実際の例を書く。
##before_action実装前
これがトップ画面。
urlを見てもらうと/usersとなっているがこれは本来ログインをしていないと見れない機能。これは非常にまずい。だってログインしなくても使えるんだからね笑
##before_action実装
before_action :logged_in_user
def logged_in_user
unless logged_in?
flash[:danger] = "Please log in."
redirect_to login_url
end
end
def logged_in?
!current_user.nil?
end
上から順に説明していく
一番上にbefore_actionを書く。また、:以下は自分で定義したものによって記述は変わる。
最初の定義についてはログインをしていなかったらログインのパスにリダイレクトする。
次の定義については比較演算子を用いてcurrent_userがnilでない状態つまりcurrent_userがいる状態。
##その他のコントローラの設定
上のままの状態だとログインのページしかいけなくなってトップページにもいけないし、新規会員登録画面にもいけなくなる。
これを改善するにはskip_before_actoinを使う。
skip_before_action:logged_in_user,only:[:new,:create]
skip_before_action:logged_in_user
skip_before_action :logged_in_user
それぞれに記述していく。ちなみにpagesコントローラーはトップページのコントローラー。
以上で実装終わり。
かなり簡単だった。
#before_action実装後
ログインしていない状態でusersにアクセスしようとするとこのようにログインページに飛ばすようにできた。
似たような実装をrailsチュートリアルにあった。参考にするといいかも。
http://useless.hatenablog.com/entry/2016/07/12/190000
このページも参考にした。