🕌
Sinatraでログイン機能を実装する
簡易的なログイン機能を実装する
本来であれば、認証周りの実装を行う際はパスワードをハッシュに変換して受け渡したり、ログイン保持のためにクッキー機能を使ったりとかなり複雑な技術を使用するのですが、比較的簡単に使えそうなsession機能のみを使用してユーザー情報を保持するログイン機能を作ってみました。
- session(ブラウザに状態を保持しておくための機能)を使えるように設定します
- sinatraにはdefaultでは実装されていないためenableに設定しましょう
app.rb
enable :sessions
- usersテーブルにはあらかじめ、name、passwordという2つのカラムを用意しておきます
- UserクラスをActiveRecord::Baseクラスを継承させます
- サインアップのルーティングを作成します
get '/signup' do
erb :signup
end
post '/signup' do
@user = User.new(name: params[:name], password: params[:password])
if @user.save
session[:user_id] = @user.id
redirect "/user/#{@user.id}"
else
erb :signup
end
end
ユーザーがデータベースに登録されたときは、そのユーザーのidを、:user_idとしてsessionに格納しています
if @user.save
session[:user_id] = @user.id
end
- サインアップのerbテンプレートを作成します
signup.erb
<p>サインアップ</p>
<form action="/signup" method="post">
<label for="name">名前: </label>
<input id="name" type="text" name="name">
<label for="password">パスワード:</label>
<input id="password" type="password" name="password">
<input type="submit" value="送信">
</form>
- ログインのルーティングを作成します
get '/login' do
erb :login
end
post '/login' do
@user = User.find_by(name: params[:name], password: params[:password])
if @user.nil?
redirect "/login"
end
session[:user_id] = @user.id
redirect "/user/#{@user.id}"
sessionに格納された:user_idと、ログインしようとしているユーザーのidを比較して、同一である時のみ詳細ページにリダイレクトされます
- ログインのerbテンプレートを作成します
login.erb
<p>ログイン</p>
<form action="/login" method="post">
<label for="password">名前:</label>
<input id="name" type= "text" name="name">
<label for="password">パスワード:</label>
<input id="password" type= "password" name="password">
<input type= "submit" value="ログイン">
</form>
- ログアウトのルーティングを作成します
post '/logout' do
session.clear
redirect '/'
end
- ログインのフォームを作成します
<form method="post" action="/logout">
<button>logout</button>
</form>
これでひととおり、サインアップ、ログイン、ログアウトの機能を実装できました🎵
ただし、sessionの生存期間は短いのと、今回のログイン方法ではセキュリティー上の問題などもあるため、あれば正しい認証機能の実装方法も勉強します!!!
参照:
[sinatraでログイン機能]https://qiita.com/ibarakishiminn/items/96c5b13a687ee8ca98f2
Railsで挫折した人のためのSinatra -5-
Discussion