Rails で簡易的な年齢認証(年齢確認)を導入する方法
はじめに
簡易的に「あなたはxx歳以上ですか?」の年齢認証ページを挟む方法について整理した。
前提や要件は以下。
- ユーザー登録なし
- ページ表示前に単純な年齢認証を挟む
- Yes を選択したら、表示しようとしていたページに移動
- No を選択したら、トップページにリダイレクト
- 一度 Yes を選択したら、(指定期間内は)その後の年齢認証は行わない
TL;DR
ちょっと分かりづらいけど。
- cookie に「年齢認証結果」と「本来表示しようとしていたページ(URL)」を保持すると OK
- 「年齢認証結果」がなければ、「本来表示しようとしていたページ(URL)」を保持しつつ、年齢認証ページにリダイレクト
- 年齢認証で Yes が選ばれたら、「年齢認証結果」を保持して、「本来表示しようとしていたページ(URL)」にリダイレクト
目次
環境・条件
1 | $ sw_vers |
詳細
何らかの商品ページにアクセスしようとした時に、年齢認証を挟むイメージ。
ルーティング
config/routes.rb
1 | Rails.application.routes.draw do |
コントローラ
以下の 2つの cookie を利用する
over18
: 18歳以上ならyes
で保持original_url
: ユーザーが表示しようとしているページ、
1 | class ItemController < ApplicationController |
ビュー
app/views/item/verify_age.htlm.slim
1 | p |
処理の流れ
読めば分かると思うが、
- 何らかの商品ページにアクセス
cookies[:over18]
を確認し、yes
でなければcookies[:original_url]
に移動先ページを保持しておき、- 年齢認証ページにリダイレクト
- 年齢認証ページで
yes
を選んだらverified
に移動cookies[:over18]
にyes
を設定し、cookies[:original_url]
にリダイレクト
- 以降は
cookies[:over18]
がyes
のため、年齢認証はスキップされる
という感じ。
これの良い(楽な)点は、「POST でデータを受け取ったりする必要が無い」というところ。ダメな点は「簡単に嘘を付ける」というところ。
より厳密にやるなら、「ユーザーに誕生日を入力」させて、「表示時に年齢計算を行って判断」という感じの方が良いと思う。
※「ユーザーに誕生日を入力」は、誕生日入力フォームだったり、そもそもユーザー登録だったり。
まとめ
- cookie に「年齢認証結果」と「本来表示しようとしていたページ(URL)」を保持すると OK
- 「年齢認証結果」がなければ、「本来表示しようとしていたページ(URL)」を保持しつつ、年齢認証ページにリダイレクト
- 年齢認証で Yes が選ばれたら、「年齢認証結果」を保持して、「本来表示しようとしていたページ(URL)」にリダイレクト
その他・メモ
ちなみに年齢計算するなら、以下のような感じ(と思っている)。
1 | def over18? |
参考文献
関連記事
- Rails で rambulance を使ってエラー種別ごとに動的にエラーページを切り替える
- Rails で high_voltage を使って静的ページを作成する
- Rails で favicon の設定
- Rails で OGP を content_for で設定する方法
- Rails で既存の DB を利用するアプリケーションの作成方法(DB 参照のみ)
- Rails で Devise と論理削除を両立する方法
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア