Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ_по созданию ИС с помощью RoR_2018.docx
Скачиваний:
9
Добавлен:
17.06.2023
Размер:
12.5 Mб
Скачать

8 Аутентификация пользователей

Аутентификация пользователей - популярная тема у web-разработчиков. Бывают разные решения для этой задачи. На данный момент довольно популярным является решение - подключение библиотеки «Devise», однако в рамках учебно-ознакомительных требований мы рассмотрим самостоятельную разработку аутентификации.

Если рассматривать разработку как список задач, то нам нужно:

  • предоставить форму, позволяющую пользователям ввести имя и пароль;

  • после входа в административную область нужно каким-то образом зафиксироватьэтот факт для всей остальной сессии (или до тех пор, пока невыйдут из административной области);

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

  1. Первым делом нужно создать таблицу в которой будут хранится данные о пользователях сайта. Приведенную ранее схему БД изменяем, добавив новую таблицу.

Рисунок 8.1 – Измененная схема БД

Пропишите в консоли команду для генерации временной платформы:

rails g scaffold User name:string password_digest:string

Внесите изменения в БД командой:

rake db:migrate

  1. Нужно конкретизировать модель пользователя. Для этого откройте файл /app/models/user.rbи пропишите следующий код:

validates :name, presence: true, uniqueness: true

has_secure_password

Сохраните и закройте.

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

  1. Обновимформы. Откройтефайл /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>

Сохраните файл.

  1. Откройте файл /app/views/users/show.html.erb и удалите строки:

<p>

<strong>Password digest:</strong>

<%= @user.password_digest %>

</p>

  1. Откройте файл/app/controllers/users_controller.rb найдите в конце строку:

params.require(:user).permit(:name, :password_digest)

Изамените ее на

params.require(:user).permit(:name, :password, :password_confirmation)

Сохраните файл.

  1. Теперь нам нужен контроллер сессии для поддержки входа в административную область и выхода из нее, и нам нужен контроллер для работы администраторов. Пропишем в консоли две команды:

rails g controller Sessions new create destroy

rails g controller Admin index

  1. В код файла /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происходить обрыв текущей сессии.

  1. В файле /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

  1. Для прерывания сессии необходимо создать кнопку. Желательно размещать ее на всех страницах ИС, однако в данном примере разместим ее на главной странице. Откройте файл /app/views/home_page/index.html.erbи вставьте в начало кода, как на рисунке 8.4, следующий код:

<% if session[:user_id] %>

<%= button_to 'Выйти', logout_path, method: :delete %>

<% end %>

Рисунок 8.5 – Код главной страницы

  1. Пропишем маршрутизацию для новых контроллеров. В файл /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

  1. Добавим недавно созданный справочник «Пользователи» на главную страницу. Для этого откройте файл 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главной страницы

Сохраните файл.

  1. Для работы аутентификации нужно разблокировать библиотеку “bcrypt”. Для этого откройте файл в проекте /Gemfile найдите строку:

# gem 'bcrypt', '~> 3.1.7'

и замените ее на

gem 'bcrypt'

Сохраните и закройте файл.

Пропишите в консоли

Bundle install

Запустите сервер и проверьте работу справочника «Пользователи».

Важно! Добавьте пользователя с логином «Admin» и придумайте ( лучше спросить у преподавателя) ему пароль. Если вам не удалось добавить нового пользователя, то дальнейшая работа будет невозможна.

  1. Добавим ограничение доступа. Откройте файл /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

Все готово. Сохраните файл. Перезапустите сервер и проверьте работу аутентификации.