あなたのRailsアプリ に行レベルのセキュリティを追加し、データベースを使用したWebアプリケーションを構築している場合は、行レベルを追加することを意味複数のユーザーを、したいことセキュリティ、および認証を提供します。
レールは、Deviseというクールな宝石で助けます。 DeviseはUserテーブルとビューを作成して、セッションでWebアプリケーションを認証し、各ビューに認証を追加して、セッションを確認してそのビューを確認することができます。
これはすべて問題はありませんが、ユーザーごとにデータベース内のデータを制限するという私の他の問題は解決しません。だから私はDevise Userモデル、特にidフィールドを使い、idフィールド(私はuser_idと呼んでいました)を含むように他のデータベーステーブルによって変更しました。これは、モデル呼び出しのようにRailsアプリケーションの残りの部分を微調整して、各SQLクエリの一部としてセッションuser_idを使用するときにすべて機能します。私は基本的なステップを説明するのに刺すようにしましょう。細かいことはありますが、あなたのために即興で行う必要があります。
私の目のプロセスは、Devise固有の手順と行レベルのセキュリティ手順に分かれています。
工夫ステップあなたのRailsプロジェクト
add devise gem to gem file
gem ‘devise’
bundle install
rails generate devise:install
(インストールはレールのアプリに工夫 - appディレクトリのルートにある)に工夫を追加
rails g devise:views
(オプションの手順:これは、私たちがカスタマイズしてスタイルを設定できるようにビューをコピーします)
rails generate devise User
(ユーザモデルを作成する)
bundle exec rake db:migrate
(表を作成します - あなたは、データベースの構造を変更するにはYMLに権限が必要です注意してください)考案関連のステップに
残り
ユーザーがログインしているかどうかを確認し、ログインIDまたは新しいユーザーとログインリンクを表示しているかどうかを確認するトップdivをapplication.html.erbに追加します
<div class=”top”>
<p class=”notice”><%= notice %></p>
<p class=”alert”><%= alert %></p>
<p>
<% if user_signed_in? %>
Logged in as <strong><%= current_user.email %></strong>.
<%= link_to ‘Edit profile’, edit_user_registration_path %> |
<%= link_to “Logout”, destroy_user_session_path, method: :delete %>
<% else %>
<%= link_to “Sign up”, new_user_registration_path %> |
<%= link_to “Login”, new_user_session_path %>
<% end %>
</div>
ログインしていないときに表示する 'guest'コントローラとビュー - ルートを更新するroutes.rbもあります。つまり、誰かがあなたのサイトに初めて行くときはゲストに連れて行ってくださいコントローラ、データではありません!まだセッションがありません。ユーザーは、他のすべてのデータ/ LOGGEDINコントローラで
if user_signed_in?
redirect_to :controller=>’home’, :action=> ‘index’
end
にログインしている場合
更新ゲスト/ルートコントローラは、具体的には、indexアクションは、コントローラにログインに移動し、コントローラの先頭に以下を追加アクションの前に:これは誰も、認証されずにURLパスを使用してページに着陸することを保証します。
before_filter :authenticate_user!
行レベルは
アルターあなたはuser_idの列と行レベルのセキュリティ「RLS」をするテーブルを繰り返します。
mysql> ALTER TABLE mytable ADD COLUMN user_id VARCHAR(255) AFTER id;
アップデートusersテーブルから有効なuser_idを持つテーブル(工夫が1で最初のユーザーIDを開始します表示されますので、これは、あなたがすでに登録フォームを持つユーザーを作成したと仮定し。それとも1を使用)
テーブルにUSER_IDを添加mysql> UPDATE mytable SET user_id = (SELECT id FROM users WHERE email = ‘[email protected]’);
ハンドルは、パラメータオブジェクト内USER_IDフィールドを更新し、アクションを作成し、データ/ LOGGEDINコントローラで
を挿入します。
def create
params[:mytable][:user_id] = current_user.id
…
end
ハンドル選択するには、/データ/ LOGGEDINモデルでパラメータ
としてuser_idを渡すことによって、クエリは、新しい私のクエリスコープにuser_idを通過した後、他のスコープと新しいスコープが(合格することを確認することという組み合わせ他のスコープにUSER_ID;)これを行うために他の方法がありますが、私はスコープを愛する:データで
scope :my, -> (user_id) { where(“user_id = ?”, user_id) }
scope :mylovelyquery, -> (user_id) { my(user_id).where(:mylovelyselectioncriteria=>”A”).order(“mysortfield”) }
を/コントローラを記録し、変更のindexアクションはcurrent_user.id取得し、あなたが作成したスコープのActiveRecordにそれを渡します。この手順は面倒であり、頻繁に行うことができます - コントローラインデックスまたはSELETを実行するコントローラアクションを探して、RLSが必要です!これはAjax呼び出しにも当てはまります。
def index
@user_id = current_user.id
@mytables = Mytable.my(@user_id).order(mylovelysortfield DESC”)
end
教訓は、おそらく最も私をハングアップ一つのことは、データベースの検索いずれかを実行する前に、current_user.idを得るために忘れました。
ユーザーとアパートメントの間に関連がある場合、アプリケーションの設定方法がわからないと、編集しようとしているアパートメントがユーザーのものであることを確認できますか? – djlumley
ユーザーとアパートの間にはどのようなモデルと関係がありますか? – sarnold
このレールスカストは、あなたの答えをお寄せいただきありがとうございます。しかし、私は何か他のものを意味します。http://railscasts.com/episodes/1-caching-with-instance-variables –