今回はユーザーがログインやログアウトを行う。
本章では、ログインの基本的な仕組みを実装
ブラウザがログインしている状態を保持し、ユーザーによってブラウザが閉じられたら状態を破棄するといった仕組み
ログイン済みのユーザー(current user)だけがアクセスできるページや、扱える機能などを制御していきます。
このような制限や制御の仕組みを認可モデル(Authorization Model)という。
セッション
ユーザーログインの必要なWebアプリケーションでは、セッション(Session)と呼ばれる半永続的な接続をコンピュータ間(ユーザーのパソコンのWebブラウザとRailsサーバーなど)に別途設定します。
Railsでセッションを実装する方法として最も一般的なのは、cookiesを使う方法
....。
新しいブランチを作る
$ git checkout -b basic-login
Sessionsコントローラ
ここではnew
アクションを作る
ubuntu:~/environment/sample_app (basic-login) $ rails generate controller Sessions new
Running via Spring preloader in process 9802
create app/controllers/sessions_controller.rb
route get 'sessions/new'
invoke erb
create app/views/sessions
create app/views/sessions/new.html.erb
invoke test_unit
create test/controllers/sessions_controller_test.rb
invoke helper
create app/helpers/sessions_helper.rb
invoke test_unit
invoke assets
invoke scss
create app/assets/stylesheets/sessions.scss
ファイルを作成
リソースを追加して標準的なRESTfulアクションをgetできるようにする
config/routes.rb
Rails.application.routes.draw do
get 'sessions/new'
root 'static_pages#home'
# 何の意味がわからん
# ホーム画面がhomeページなるらしい
get '/help', to: 'static_pages#help'
# static_pagesコントローラからhomeアクションに紐付けされる
# getでアクセルすることでページを取得することができる
get '/about', to: 'static_pages#about'
# 何を書いているかはわからない
get '/contact', to: 'static_pages#contact'
# aboutアクションにGETリクエストを送る
get '/signup', to: 'users#new'
# urlに/signupと書くとuserコントローラのnewアクションを起こす
get '/login', to: 'sessions#new'
# データを取得
post '/login', to: 'sessions#create'
# データを投稿
delete '/logout', to: 'sessions#destroy'
# 削除
resources :users
# /users/1の有効にするため
end
リクエスト url 名前付きルート アクション 用途
GET /login login_path new 新しいセッションのページ(ログイン)
POST /login login_path create 新しいセッションの作成(ログイン)
DELETE /logout logout_path destroy セッションの削除(ログアウト)
rails routes
login GET /login(.:format) sessions#new
POST /login(.:format) sessions#create
logout DELETE /logout(.:format) sessions#destroy
演習
1.GET login_pathとPOST login_pathとの違いを説明できますか? 少し考えてみましょう。
GET login_path
はloginページを表示させる
POST login_path
はloginのためにデータを送信する
2.ターミナルのパイプ機能を使ってrails routesの実行結果とgrepコマンドを繋ぐことで、Usersリソースに関するルーティングだけを表示させることができます。同様にして、Sessionsリソースに関する結果だけを表示させてみましょう。現在、いくつのSessionsリソースがあるでしょうか? ヒント: パイプやgrepの使い方が分からない場合は 『コマンドライン編』の 「grepで検索する」を参考にしてみてください。
ubuntu:~/environment/sample_app (basic-login) $ rails routes | grep sessions#
sessions_new GET /sessions/new(.:format) sessions#new
login GET /login(.:format) sessions#new
POST /login(.:format) sessions#create
loguniELETE /logout(.:format) sessions#destroy
何がしたいのかわからない。