本記事は、🔽「Turbo Rails Tutorial」の学習を進めていく際の個人メモです!
🔽 前章の記事はこちら
6章 Turbo Streams and security
この章では、Turbo Streamsセキュリティの仕組みについて学びました。具体的には、5章までに作成してきた「見積もり」作成アプリにログイン機能をつけ、以下の実験をしました。
やりたいこと
ログイン後、同じcampany
内のメンバーであれば、そのcampany
内の見積もりがリアルタイムに更新される。違うcampany
のメンバーは他のcammpany
の見積もりは閲覧できない。
実験
本章に記載しているコードの通り進め、index
アクションでは「自分のcampany
の見積もりの一覧表示」を表示するよう実装します。
まずは同じKPMG
というcampany
同士のメンバーで確認。問題なく見積もりがリアルタイムに共有されます。
今度は右のブラウザ(シークレットウィンドウ)でPwC
というcampany
のメンバーでログインしています。すると、他のcampany
なのに、リアルタイムで見積もりが表示されてしまうというバグが発生。
ちなみに見積もりとして保存されてはいないので、PwC
側ではリロードすると消えます。
何がまずいのか?
ブラウザの検証で、以下の<turbo-cable-stream-source>
タグを確認してみると、どのユーザーでログインしてもすべて同じsigned-stream-name
を使用していることが分かりました。
<turbo-cable-stream-source channel="Turbo::StreamsChannel" signed-stream-name="InF1b3RlcyI=--fcf8a7eb5aea37a4a80930967e3332d3a48ba0f5ab12e509c7cce8f7175a17fc" connected=""></turbo-cable-stream-source>
このせいで、先ほどのバグが起こっていました。
対策
Streams名を、campany
ごとに変更する必要があります。
class Quote < ApplicationRecord
.
.
broadcasts_to ->(quote) { [quote.company, "quotes"] }, inserts_by: :prepend
end
受け取る側も変更します。
<%= turbo_stream_from current_company, "quotes" %>
確認
これでバグが解消しました。<turbo-cable-stream-source>
タグ内のsigned-stream-name
が、campany
ごとに別のものを使用するようになったことも確認できました。
まとめ
Turbo Streams を使用する際は、モデルのbroadcasts_to
メソッドとビューのturbo_stream_from
メソッドが適切に設定されていることを確認してから利用すること。テストでしっかり確認しながら開発することが大事ですね!
次の章は、Hotwire を使用したフラッシュメッセージについて学びます。