Слайд 2
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-1.jpg)
Слайд 3
![Знания Актуальность Аутентификация и авторизация Сессии Ручная аутентификация Аутентификация с](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-2.jpg)
Знания
Актуальность
Аутентификация и авторизация
Сессии
Ручная аутентификация
Аутентификация с помощью gem devise
Каждый сверчок — знай
свой шесток (gem pundit)
Некоторые наиболее распространённые уязвимости
Слайд 4
![Что такое обеспечение безопасности?](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-3.jpg)
Что такое обеспечение безопасности?
Слайд 5
![Что такое обеспечение безопасности? Процесс устранения последствий различных «опасностей» и профилактика их причин](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-4.jpg)
Что такое обеспечение безопасности?
Процесс устранения последствий различных «опасностей» и профилактика их
причин
Слайд 6
![Почему обеспечение безопасности актуально?](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-5.jpg)
Почему обеспечение безопасности актуально?
Слайд 7
![Аутентификация Есть в системе? Да Нет Посетитель](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-6.jpg)
Аутентификация
Есть в системе?
Да
Нет
Посетитель
Слайд 8
![Виды аутентификации Логин/пароль Токен (для REST) OAuth 2.0 (соц. сети)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-7.jpg)
Виды аутентификации
Логин/пароль
Токен (для REST)
OAuth 2.0 (соц. сети)
Слайд 9
![Авторизация](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-8.jpg)
Слайд 10
![Авторизация Имею ли право? Да Нет Пользователь](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-9.jpg)
Авторизация
Имею ли право?
Да
Нет
Пользователь
Слайд 11
![Сессия Обеспечение постоянства (обычно ActionDispatch::Session::CookieStore) Обычный хеш: session[:user_id] = user.id](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-10.jpg)
Сессия
Обеспечение постоянства (обычно ActionDispatch::Session::CookieStore)
Обычный хеш:
session[:user_id] = user.id
session[:user_id] = nil
Храниться (Rails.application.config.session_store):
В файлах
на сервере
На клиенте
В БД
Протокол DRB
Memcached / Redis
Слайд 12
![Ручная аутентификация Используется фильтр в контроллере: before_action :authorize Проверяется соответствие](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-11.jpg)
Ручная аутентификация
Используется фильтр в контроллере:
before_action :authorize
Проверяется соответствие логина и пароля данным
из БД
Пароль шифрован и проверяется с помощью метода authenticate из gem Bcrypt (заменить password на password_digest)
Вход/выход — через собственный контроллер SessionController
В случае успеха запоминаем результат в сессии
Создаём для удобства ряд вспомогательных методов (current_user, sign_in, sign_out)
Слайд 13
![Сколько нужно времени, чтобы изучить язык программирования?](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-12.jpg)
Сколько нужно времени, чтобы изучить язык программирования?
Слайд 14
![Аутентификация с devise Различные виды аутентификации Используется ряд модулей —](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-13.jpg)
Аутентификация с devise
Различные виды аутентификации
Используется ряд модулей — для запоминания входа,
подтверждения аккаунта и т. д.
Дополняется модель User (убрать password_digest)
Добавляются ряд хелперов:
user_signed_in?
current_user
authenticate_user!
…
Ряд готовых к использованию представлений
Слайд 15
![Pundit: каждый сверчок — знай свой шесток](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-14.jpg)
Pundit:
каждый сверчок —
знай свой шесток
Слайд 16
![Авторизация с pundit Контроль ролей — в контроллерах и представлениях](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-15.jpg)
Авторизация с pundit
Контроль ролей — в контроллерах и представлениях
Ролевую модель мы
создаём сами
Используются политики (обычный Ruby-класс)
Слайд 17
![Соглашения в политиках Название класса — это название модели +](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-16.jpg)
Соглашения в политиках
Название класса — это название модели + постфикс Policy.
Первый
аргумент контроллера — пользователь (обычно текущий), второй — объект, который мы хотим проверить.
Обычно есть несколько методов-запросов (т. е. с ? в конце), названия которых соответствуют названиям действий в контроллере.
Объект модели называется record.
Слайд 18
![Пример политики class PostPolicy attr_reader :user, :post def initialize(user, post)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-17.jpg)
Пример политики
class PostPolicy
attr_reader :user, :post
def initialize(user, post)
@user =
user
@post = post
end
def update?
user.admin? or not post.published?
end
end
Слайд 19
![Некоторые наиболее распространённые уязвимости Подделка межсайтовых запросов (CSRF) — ссылка](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-18.jpg)
Некоторые наиболее распространённые уязвимости
Подделка межсайтовых запросов (CSRF) — ссылка на страницу
веб-приложения, где пользователь аутентифицирован
SQL-инъекции — внедрение SQL-запроса в параметры запроса
Межсайтовый скриптинг (XSS) — внедрение вредоносного кода на стороне клиента
Слайд 20
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-19.jpg)
Слайд 21
![Умения Реализовать ручную аутентификацию пользователя Реализовать аутентификацию с помощью gem](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-20.jpg)
Умения
Реализовать ручную аутентификацию пользователя
Реализовать аутентификацию с помощью gem devise
Разделить пользователей по
ролям с помощью pundit
Обеспечить прохождение тестов после внедрения аутентификации
Слайд 22
![Реализовать аутентификацию с помощью gem devise $ rails g devise:install](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-21.jpg)
Реализовать аутентификацию с помощью gem devise
$ rails g devise:install
$ rails g
devise User
$ rails g devise:views:bootstrap_templates (gem 'devise-bootstrap-views')
def after_sign_(in|out)_path_for(resource)
before_action :authenticate_user!
Слайд 23
![Реализовать авторизацию с помощью gem pundit $ rails g pundit:install authorize Competence, :create?](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-22.jpg)
Реализовать авторизацию с помощью gem pundit
$ rails g pundit:install
authorize Competence, :create?
<%
if policy(Competence).create? %>
Слайд 24
![Обеспечить прохождение функциональных тестов # test_helper.rb # role — название](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-23.jpg)
Обеспечить прохождение функциональных тестов
# test_helper.rb
# role — название фабрики пользователя с
соответствующей ролью
# пользователь с такими email/password уже должен быть создан
# например, sign_in(:cosmonaut)
def sign_in(role)
post user_session_path, params: { user: attributes_for(role) }
end
# пример фабрики
factory :user do
password { '123456' }
factory :cosmonaut do
role { User.roles[:cosmonaut] }
email { "cosmonaut@mail.bro" }
end
end
Слайд 25
![Обеспечить прохождение приёмочных тестов # test_helper.rb # role — название](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-24.jpg)
Обеспечить прохождение приёмочных тестов
# test_helper.rb
# role — название фабрики пользователя с
соответствующей ролью
# например, sign_in(:cosmonaut)
def sign_in(role)
user = create(role)
visit new_session_url
fill_in 'Email', with: user.email
fill_in 'Password', with: user.password
click_on 'Sign in'
end
Слайд 26
![](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-25.jpg)
Слайд 27
![Неопределённости Разница между аутентификацией и авторизацией? Есть ли альтернативы devise?](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-26.jpg)
Неопределённости
Разница между аутентификацией и авторизацией?
Есть ли альтернативы devise?
Есть ли альтернативы pundit?
Да, cancancan.
Маршруты пользователя нужно прописать после devise_for
Слайд 28
![Альтернативы devise github.com/NoamB/sorcery — от EvilMartians authlogic railscasts.com/episodes/270-authentication-in-rails-3-1](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-27.jpg)
Альтернативы devise
github.com/NoamB/sorcery — от EvilMartians
authlogic
railscasts.com/episodes/270-authentication-in-rails-3-1
Слайд 29
![Результат](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-28.jpg)
Слайд 30
![Результат Изучена ручная аутентификация Изучена аутентификация с помощью devise Изучена](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-29.jpg)
Результат
Изучена ручная аутентификация
Изучена аутентификация с помощью devise
Изучена авторизация с помощью pundit
Прокачали
различные аспекты обеспечения безопасности веб-приложения на Rails
Слайд 31
![Самостоятельно Использование bcrypt для шифрования Граватары Strong parameters sanitizing …](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-30.jpg)
Самостоятельно
Использование bcrypt для шифрования
Граватары
Strong parameters
sanitizing
…
Слайд 32
![Граватар Глобально распознаваемый аватар Можно использовать на разных сайтах (брендинг)](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-31.jpg)
Граватар
Глобально распознаваемый аватар
Можно использовать на разных сайтах (брендинг)
Предоставляется изображение по умолчанию
Можно
зарегистрироваться и сохранить необходимый (info@profport.org)
Слайд 33
![Алгоритм получения Перевести email в нижний регистр Получить id с](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/417845/slide-32.jpg)
Алгоритм получения
Перевести email в нижний регистр
Получить id с помощью Digest::MD5::hexdigest
Использовать id
для получения ссылки на граватар:
"https://secure.gravatar.com/avatar/#{id}"
Использовать в image_tag (или где надо)