Deviseが嫌いなので認証機能を自前実装した

すろっくさんだよ。

Rails使ってかれこれ7年になるんですけど、経験上Deviseはもうお腹いっぱいです。というかフリーランスのときも自分でやったときもちょっといい思い出がなかったので、避けたいのですね。でも自前認証つくりたいってなったときのgemって以外とない。omniauthでよければ割とあるんですけどね。

僕は創作するのが好きなので、そっちの人向けのWebサービスを個人で作ってます。そんなわけで認証なんですけど、最近ちょっとTwitterのapi変更もあったので外部のプラットフォームにいきなり依存するのは避けたかったってのがあってまず自前〜ってなったわけですな。

本題。

まあいいgemが見つからなければRailsで自前実装ということで。自前実装は「has_secure_password」メソッド使ってやることができます。

scaffoldとかでこんなモデルつくってるとcontrollerもあると思うんでcontrollerはnew / create / update / destroyのアクションをそのまま使います。論理削除物理削除とかはあとで実装でいいかなレベルです。

セッション管理したいんでcontoroller作ります。authenticateメソッドはhas_secure_passwordを使うと自動で作成されるのでどっかで定義する必要はないです。

deviseでよく使うメソッドシリーズです。

  • current_user:ログインしている場合ユーザの情報を返します。
  • signed_in?:判定。ログインしてればtrue、してなければfalseを返します。
  • sign_in:ログインしたときの処理。
  • sign_out:ログアウトした時の処理

ユーザを作るビュー。自動作成するとこれもform_forで作られるんですがこれどうにかしてほしいですね。Rails6からform_with一択になるのでできればform_forは避けたいです。というか避けましょういつ出るんだ。

ログインフォーム。僕はこれを「app/views/shared/_login.html.slim」とかにつくって、どこからでも呼べるように切り出しました。新規登録は下に一応導線を作るなど。

routes.rb書いたら完成ー。mypageとか適当につくって飛んだりして試したら終わり。

 

これだけでできて嬉しかったです。これは他のところでもつかえるはず。