2012-04-19 2 views
2

Я хотел бы ограничить пользователей только для просмотра и редактирования данных, которые находятся в их квартире. Я сохранил их apartment_id в сессии [: apartment_id]. Итак, у меня CRUD, и я хотел бы ограничить пользователей тем, что они не могут выполнять/data/ID/edit, только для изменения идентификатора, а затем для редактирования данных. Есть ли хороший способ сделать это, скажем, через некоторую область действия или я должен проверять все в своем контроллере в каждом действии. Спасибо заранее. Dorijanruby ​​on rails ограничивает пользователей только конкретными данными

редактировать: это подробнее: позволяет сказать, что есть список пользователей, когда делать/данные и когда вы хотите увидеть конкретные данные о некоторых пользователях с ID вы бы пойти/данные/ID, например/данные/27. В моей базе данных для данных модели я получил row apartment_id, в котором говорится, в какой квартире он принадлежит.

Теперь я хочу ограничить просмотр для некоторых пользователей на основе их данных сеанса. Например, при входе пользователя он получил сеанс [: apartment_id].

Таким образом, я хочу, чтобы пользователь мог не иметь доступа к примеру/data/34 для user_id = 34, у которого есть квартира, отличная от сеанса [: apartment_id].

Кроме того, когда пользовательский доступ/данные отображаются только для того, чтобы показать пользователям его видимость.

Я знаю, что могу сделать это в каждом контроллере, для каждого метода проверить это, но могу ли я сделать это где-то в модели, чтобы быть общим? спасибо

+0

Не зная, как настроено ваше приложение, существует ли связь между пользователями и их квартирой, вы можете проверить, что квартира, которую они пытаются изменить, принадлежит их пользователю? – djlumley

+0

Какие модели и отношения у вас есть между пользователями и квартирами? – sarnold

+0

Этот railscast может помочь http://railscasts.com/episodes/1-caching-with-instance-variables –

ответ

1

Если пользователь has_many квартиры, то обычно вы можете сделать это в вашем контроллере:

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

Это будет только найти квартиры, которые принадлежат к текущему пользователю.

UPDATE

выглядит, как вы не имеете объект current_user ... так:

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. ОК. отредактировал ответ. –

2

Добавление Row-Level Security для вашего Rails приложения Если вы создаете веб-приложение с базой данных, вы можете более одного пользователя, что означает добавление строки уровня безопасности и аутентификации.

Рельсы помогают с крутым драгоценным камнем, называемым Devise. Devise создает таблицу пользователя и просматривает ее для аутентификации в веб-приложении с помощью сеанса, а затем вы можете добавить аутентификацию в каждое представление, чтобы убедиться, что у вас есть действительный сеанс для просмотра этого представления.

Это все прекрасно и денди, но не решает мою другую проблему, которая заключается в том, чтобы ограничить данные в базе данных пользователем. Поэтому я решил использовать модель Devise User, в частности поле id, и изменен другими таблицами базы данных, чтобы включить поле id (я назвал его user_id). Это все работает, когда вы затем настраиваете остальное приложение Rails, как модель, вызывает использование сеанса user_id как часть каждого SQL-запроса. Позвольте мне взять удар, объясняя основные шаги, которые имеют некоторые детали, но вам нужно импровизировать для вашего дела.

Процесс в моих глазах разделен на определенные Шаги и шаги безопасности на уровне строк.

DEViSE Шаги

Добавление Завещание ваших Rails проекта

add devise gem to gem file 

    gem ‘devise’ 

    bundle install 



rails generate devise:install 

(устанавливает разработать в рельсах приложение - быть в корневой директории приложения)

rails g devise:views 

(Необязательный шаг: это копирует виды, чтобы мы могли настроить и стиль)

rails generate devise User 

(создает модель пользователя)

bundle exec rake db:migrate 

(создает таблицу - обратите внимание вам необходимы привилегии в YML изменить структуру базы данных)

Оставаясь Разрабатывает связанные шаги

Добавьте верхний 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> 

создал «гостевой» контроллер и отобразился, когда он не вошел в систему, - также обновил route.rb, чтобы сделать это корнем - то есть, когда первый раз кто-то идет на ваш сайт, вы должны отнести их к гостю контроллер, а не данные! У вас еще нет сеанса.

обновленный гостевой/корневой контроллер, в частности, индекс действия для перехода на вход контроллера, если пользователь вошел в систему

if user_signed_in? 

    redirect_to :controller=>’home’, :action=> ‘index’ 

    end 

В любой другой контроллер данных/LoggedIn, добавьте следующие строки в верхней части контроллера перед действиями: это гарантирует, что никто не сможет использовать пути URL для приземления на странице без проверки подлинности.

before_filter :authenticate_user! 

уровне строк шаги

изменяющих таблицы, где вы хотите безопасности «RLS» на уровне строк с user_id столбца.

mysql> ALTER TABLE mytable ADD COLUMN user_id VARCHAR(255) AFTER id; 

Обновление таблицы с действительным user_id из таблицы пользователей (это предполагает, что вы уже создали пользователя с формой регистра. Или просто использовать 1, так как он появляется Разрабатывают запускает первый идентификатор пользователя на 1)

mysql> UPDATE mytable SET user_id = (SELECT id FROM users WHERE email = ‘[email protected]’); 

Ручка добавления user_id в таблице вставляет

в данных/контроллер LoggedIn CREATE действие, обновляет поле user_id в объекте параметра.

def create 

params[:mytable][:user_id] = current_user.id 

… 

end 

Ручка выбирает/запросы, передавая его user_id в качестве параметра

В модели данных/LoggedIn, передать 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”) } 

в данных/входе контроллера, индекс изменения действия, чтобы получить 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, прежде чем делать какой-либо извлечения базы данных.

Смежные вопросы