- •Введение
- •1 Установка и запуск первого приложения
- •1.1 Установка системы Ruby on Rails
- •1.2 Разработка простейшего приложения с целью проверки работоспособности установленного по
- •2 Подготовка к выполнению проектирования ис
- •3 Настройка базы данных
- •4 Генерация временных платформ
- •5 Работа с контроллерами
- •6 Представления
- •7 Экспорт отчетов
- •8 Аутентификация пользователей
- •9 Многопользовательский режим
- •10 Разработка интерфейса
- •10.1 Стандартный Интернет-интерфейс
- •10.2 Расширение возможностей изменения интерфейса с помощью модуля Bootstrap
- •11 Элементы сложной обработки данных
- •11.1 Динамические средства поиска
- •Список использованных иточников
8 Аутентификация пользователей
Аутентификация пользователей - популярная тема у web-разработчиков. Бывают разные решения для этой задачи. На данный момент довольно популярным является решение - подключение библиотеки «Devise», однако в рамках учебно-ознакомительных требований мы рассмотрим самостоятельную разработку аутентификации.
Если рассматривать разработку как список задач, то нам нужно:
предоставить форму, позволяющую пользователям ввести имя и пароль;
после входа в административную область нужно каким-то образом зафиксироватьэтот факт для всей остальной сессии (или до тех пор, пока невыйдут из административной области);
ограничить доступ к административной области приложения,разрешив удалять справочники только тем, кто вошел вадминистративнуюобласть.
Первым делом нужно создать таблицу в которой будут хранится данные о пользователях сайта. Приведенную ранее схему БД изменяем, добавив новую таблицу.
Рисунок 8.1 – Измененная схема БД
Пропишите в консоли команду для генерации временной платформы:
rails g scaffold User name:string password_digest:string
Внесите изменения в БД командой:
rake db:migrate
Нужно конкретизировать модель пользователя. Для этого откройте файл /app/models/user.rbи пропишите следующий код:
validates :name, presence: true, uniqueness: true
has_secure_password
Сохраните и закройте.
Подправим представления пользователей, чтобы не было видно паролей. Откройте файл /app/views/users/index.html.erbи удалите строчки (Рисукнок 8.1):
<th>Password digest</th>
<td><%= user.password_digest %></td>
Рисунок8.2 – Файл /app/views/users/index.html.erb
Обновимформы. Откройтефайл /app/views/users/_form.html.erb и замените старый код на новый:
<div class="field">
<%= f.label :Имя %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :Пароль %><br>
<%= f.password_field :password %>
</div>
<div class="field">
<%= f.label :Повторите_пароль %><br>
<%= f.password_field :password_confirmation %>
</div>
<divclass="actions">
<%= f.submit "Добавить пользователя" %>
</div>
Сохраните файл.
Откройте файл /app/views/users/show.html.erb и удалите строки:
<p>
<strong>Password digest:</strong>
<%= @user.password_digest %>
</p>
Откройте файл/app/controllers/users_controller.rb найдите в конце строку:
params.require(:user).permit(:name, :password_digest)
Изамените ее на
params.require(:user).permit(:name, :password, :password_confirmation)
Сохраните файл.
Теперь нам нужен контроллер сессии для поддержки входа в административную область и выхода из нее, и нам нужен контроллер для работы администраторов. Пропишем в консоли две команды:
rails g controller Sessions new create destroy
rails g controller Admin index
В код файла /app/controllers/session_controller.rb вставьте следующий код (Рисунок8.2):
skip_before_action :authorize
def new
end
def create
user = User.find_by(name: params[:name])
if user and user.authenticate(params[:password])
session[:user_id] = user.id
redirect_to admin_url
else
redirect_to login_url, alert: "Неверная комбинация имени и пароля"
end
end
def destroy
session[:user_id] = nil
redirect_to login_url, notice: "Сеанс работы завершен"
end
Рисунок 8.3 – Код контроллера сессий
В этом коде при создании новой сессии будет осуществлять проверка пользователя, а также в методе destroyпроисходить обрыв текущей сессии.
В файле /app/views/sessions/new.html.erb создадим шаблон для авторизации. Вставьте код в файл (Рисунок 8.3):
<div class="depot_form">
<% if flash[:alert] %>
<p id="notice"><%= flash[:alert] %></p>
<% end %>
<%= form_tag do %>
<fieldset>
<legend>Авторизуйтесь, пожалуйста</legend>
<div>
<%= label_tag :name, 'Имя:' %>
<%= text_field_tag :name, params[:name] %>
</div>
<div>
<%= label_tag :password, 'Пароль:' %>
<%= password_field_tag :password, params[:password] %>
</div>
<div>
<%= submit_tag "Login" %>
</div>
</fieldset>
<% end %>
</div>
Рисунок 8.4 – Код шаблона файла new.html.erb
Для прерывания сессии необходимо создать кнопку. Желательно размещать ее на всех страницах ИС, однако в данном примере разместим ее на главной странице. Откройте файл /app/views/home_page/index.html.erbи вставьте в начало кода, как на рисунке 8.4, следующий код:
<% if session[:user_id] %>
<%= button_to 'Выйти', logout_path, method: :delete %>
<% end %>
Рисунок 8.5 – Код главной страницы
Пропишем маршрутизацию для новых контроллеров. В файл /config/routes.rbвставьте следующий код (Рисунок 8.5):
get 'admin' => 'home_page#index'
controller :sessions do
get 'login' => :new
post 'login' => :create
delete 'logout' => :destroy
end
Рисунок 8.6 – Код файла routes.rb
Добавим недавно созданный справочник «Пользователи» на главную страницу. Для этого откройте файл app\views\home_page\index.html.erb и вставьте код, как на рисунке 8.6.
<tr>
<td>
<h3>Пользователи сайта<h3>
</td>
</tr>
<tr>
<td>
<%= link_to 'Пользователи', controller: 'users' %><br>
</td>
</tr>
Рисунок 8.7 – Код файла index.html.erbглавной страницы
Сохраните файл.
Для работы аутентификации нужно разблокировать библиотеку “bcrypt”. Для этого откройте файл в проекте /Gemfile найдите строку:
# gem 'bcrypt', '~> 3.1.7'
и замените ее на
gem 'bcrypt'
Сохраните и закройте файл.
Пропишите в консоли
Bundle install
Запустите сервер и проверьте работу справочника «Пользователи».
Важно! Добавьте пользователя с логином «Admin» и придумайте ( лучше спросить у преподавателя) ему пароль. Если вам не удалось добавить нового пользователя, то дальнейшая работа будет невозможна.
Добавим ограничение доступа. Откройте файл /app/controllers/application_controller.rb и вставьте код после строчки:
protect_from_forgery with: :exception
Код:
before_action :authorize
protected
def authorize
unless User.find_by(id: session[:user_id])
redirect_to login_url, notice: "Пожалуйста, пройдите авторизацию"
end
end
Все готово. Сохраните файл. Перезапустите сервер и проверьте работу аутентификации.