3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Turbo Streams とセキュリティの話。Turbo Rails Tutorial をやってみた(6章)

Posted at

本記事は、🔽「Turbo Rails Tutorial」の学習を進めていく際の個人メモです!

🔽 前章の記事はこちら

6章 Turbo Streams and security

この章では、Turbo Streamsセキュリティの仕組みについて学びました。具体的には、5章までに作成してきた「見積もり」作成アプリにログイン機能をつけ、以下の実験をしました。

やりたいこと

ログイン後、同じcampany内のメンバーであれば、そのcampany内の見積もりがリアルタイムに更新される。違うcampanyのメンバーは他のcammpanyの見積もりは閲覧できない。

実験

本章に記載しているコードの通り進め、indexアクションでは「自分のcampanyの見積もりの一覧表示」を表示するよう実装します。

まずは同じKPMGというcampany同士のメンバーで確認。問題なく見積もりがリアルタイムに共有されます。

output.gif

今度は右のブラウザ(シークレットウィンドウ)でPwCというcampanyのメンバーでログインしています。すると、他のcampanyなのに、リアルタイムで見積もりが表示されてしまうというバグが発生。
output2.gif

ちなみに見積もりとして保存されてはいないので、PwC側ではリロードすると消えます。

output3.gif

何がまずいのか?

ブラウザの検証で、以下の<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ごとに変更する必要があります。

app/models/quote.rb
class Quote < ApplicationRecord
  .
  .
  broadcasts_to ->(quote) { [quote.company, "quotes"] }, inserts_by: :prepend
end

受け取る側も変更します。

app/views/quotes/index.html.erb
<%= turbo_stream_from current_company, "quotes" %>

確認

これでバグが解消しました。<turbo-cable-stream-source>タグ内のsigned-stream-nameが、campanyごとに別のものを使用するようになったことも確認できました。
output4.gif

まとめ

Turbo Streams を使用する際は、モデルのbroadcasts_toメソッドとビューのturbo_stream_fromメソッドが適切に設定されていることを確認してから利用すること。テストでしっかり確認しながら開発することが大事ですね!

次の章は、Hotwire を使用したフラッシュメッセージについて学びます。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?