Добавление 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, прежде чем делать какой-либо извлечения базы данных.
Не зная, как настроено ваше приложение, существует ли связь между пользователями и их квартирой, вы можете проверить, что квартира, которую они пытаются изменить, принадлежит их пользователю? – djlumley
Какие модели и отношения у вас есть между пользователями и квартирами? – sarnold
Этот railscast может помочь http://railscasts.com/episodes/1-caching-with-instance-variables –