2012-04-19 11 views
2

私は自分のアパートからのデータの表示と編集のみを制限したいと考えています。セッション[:apartment_id]に自分のapartment_idを保存しました。ですから、私はCRUDを持っていますが、ID/ID /編集ができないようにユーザーを制限し、IDを変更してからデータを編集するようにしたいと考えています。これを行う良い方法がありますか、いくつかの範囲を介して言うことができますか、私はすべてのアクションで私のコントローラ内のすべてを検証する必要があります。 ありがとうございます。 Dorijanruby​​ on railsはユーザーを特定のデータに限定します

編集: これは、より詳細である: は/データを行うと、あなたがIDを持つ一部のユーザーに関する特定のデータを見たいときに/データ/ IDの例に行くだろうというときのユーザーのリストがあると言うことができます/データ/ 27。 私のデータベースでは、モデルデータのために、私はどのアパートにそのユーザーが属しているかを示すapartment_idという行があります。

ここでは、セッションデータに基づいて一部のユーザーの表示を制限します。たとえば、ユーザーがログインすると、彼はセッション[:apartment_id]を取得しました。

したがって、セッション[:apartment_id]とは異なるapartment_idを持つuser_id = 34に対して、example/data/34にアクセスできないユーザーを制限したいと考えています。

また、ユーザがアクセスした場合、/データのみが彼の見た目からユーザを表示します。

私は各コントローラでこれを行うことができますが、すべての方法でこれをチェックすることができますが、一般的にはモデルのどこかでこれを行うことができますか?これは、現在のユーザーのみに属しているマンションがあります

def edit 
    current_user.apartments.find(params[:id]) 
end 

: あなたが

+0

ユーザーとアパートメントの間に関連がある場合、アプリケーションの設定方法がわからないと、編集しようとしているアパートメントがユーザーのものであることを確認できますか? – djlumley

+0

ユーザーとアパートの間にはどのようなモデルと関係がありますか? – sarnold

+0

このレールスカストは、あなたの答えをお寄せいただきありがとうございます。しかし、私は何か他のものを意味します。http://railscasts.com/episodes/1-caching-with-instance-variables –

答えて

1

ユーザーhas_manyのアパート場合、一般的に、あなたのコントローラでこれを行うことができ感謝しています。あなたはとても... CURRENT_USERオブジェクトを持っていないよう

UPDATE

に見えます:

def edit 
    @apartment = Apartment.find(params[:id]) 
    redirect_to root_path, error: "You do not have access for this apartment" 
end 
+0

@client = Client.find(params [:id])、Client.apartment_id!= session [:apartment_id] – user899119

+0

hmmの場合、このデータの編集を制限したい。 OK。答えを編集しました。 –

2

あなたの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を得るために忘れました。

関連する問題