Spring Security — среда для аутентификации и авторизации пользователей. Фреймворк применяется для защиты приложений на Spring. В нем представлены базовые инструменты безопасности, которые без труда расширяются для решения разных задач.
Помогаем
В этой статье мы изучим основы Spring Security, а также попрактикуемся, создав простое приложение с регистрацией и аутентификацией пользователя.
Содержание:
1. Основные возможности
2. Пример подключения Spring Security
3. Создание проекта и подключение зависимостей
Итоги
В целях пропаганды культуры безопасности жизнедеятельности среди детей и молодежи, подготовки обучающихся к действиям в условиях различного рода экстремальных и опасных ситуаций, практической отработки навыков безопасного поведения в чрезвычайных ситуациях, Тольяттинский государственный университет, Институт инженерной и экологической безопасности, проводит цикл Всероссийских отрытых уроков по дисциплине «Безопасность жизнедеятельности».
Запланировано проведение 4-х открытых уроков по тематике:
1 Туристическая безопасность – 29 сентября 2022 г.
2 Пожарная безопасность – 20 октября 2022 г.
3 Радиационная безопасность – 24 ноября 2022 г.
4 Кибербезопасность – 22 декабря 2022 г.
29 сентября 2022 года в 14.00 (по Москве) Первый Всероссийский отрытый урок «Туристическая безопасность».
Урок будет проходить в формате on-line, для участия в мероприятии необходимо будет пройти по ссылке: https://trovo.live/s/EngineeringSafety/
Инструкция для регистрации на сайте https://trovo.live
1 При заходе на сайт необходимо нажать «Войти/Зарегистрироваться» Если у вас сайт на английском языке, вы можете перевести его на русский язык.
2 После нажатия на кнопку «Войти/Зарегистрироваться» перейдите во вкладку с регистрацией.
3 Вам необходимо ввести все необходимые данные для регистрации.
4 После того, как вы нажмёте кнопку «Зарегистрироваться», на почту придёт ссылка с кодом для подтверждения. Данный код необходимо будет ввести на сайте в появившемся окне.
5 После введения кода, ваша запись будет подтверждена, и вы сможете войти в систему.
Рекомендуем организовать просмотр лекции коллективно и регистрировать аккаунт под школу/класс, чтобы избежать возможных перегрузок и спама в чате.
Основные возможности
Шифрование паролей
Spring Security не ограничивается аутентификацией. Фреймворк также помогает решить проблему с безопасным хранением паролей.
Spring Security предлагает назначить объекту UserDetails собственный шифровальщик паролей. По умолчанию используется BCrypt. Также можно настроить количество раундов хеширования и реализацию случайного алгоритма.
Навчіться у вільний час розробляти вебінтерфейси, які подобатимуться клієнтам, та заробляйте від $1000
РЕЄСТРУЙТЕСЯ!
Аутентификация In-Memory
Для сохранения информации о пользователях и выполнения аутентификации можно использовать временную базу данных, которая остается в оперативной памяти приложения.
Это полезно при разработке и тестировании. Реальная база данных при таком подходе остается нетронутой.
LDAP-аутентификация
Lightweight Directory Access Protocol (LDAP) — протокол аутентификации учетных записей пользователей в организациях. Позволяет определять структуру пользователей и групп пользователей, назначать им права доступа.
Дополнительную информацию вы можете получить в официальном руководстве по использованию аутентификации LDAP.
Управление сессией
Spring Security предоставляет механизмы для управления сеансом пользователя. Он создает эти механизмы контроля при входе в систему и уничтожает при выходе.
Для обеспечения безопасности доступны дополнительные средства, которые помогают, например, избежать отслеживания сеансов.
Remember Me Authentication
Это встроенный механизм распознавания, благодаря которому пользователям не нужно вводить учетные данные при каждом посещении сайта.
Spring Security предлагает несколько способов реализации этого типа аутентификации — например, хеширование данных с помощью секретного ключа или хранение постоянного токена в базе данных.
OAuth 2
Open Authorization 2.0 — открытый стандарт проверки прав пользователя с помощью сервиса авторизации. Он также используется для реализации таких функций, как вход через учетные записи Facebook, Google и других крупных площадок.
Настройка сервера авторизации и внедрение OAuth сопряжены с высоким риском и могут отнять много времени. В этом процессе легко ошибиться и создать уязвимость. Spring Security предлагает защитить сайт с помощью готовых инструментов — например, Auth0.
Это лишь некоторые возможности аутентификации и авторизации через Spring Security. Если хотите узнать больше, смотрите документацию Spring Boot.
Веб-безопасность
Безопасность сайта требует бдительности во всех аспектах дизайна и использования сайта. Эта вводная статья не сделает из вас гуру безопасности веб-сайта, но она поможет вам понять, откуда приходят угрозы, и что вы можете сделать, чтобы укрепить своё веб-приложение против наиболее распространённых атак.
Что такое безопасность сайта?
Интернет – опасное место! Мы регулярно слышим о том, что веб-сайты становятся недоступными из-за атак типа отказано в обслуживании, или отображение изменённой (и часто повреждённой) информации на их страницах. В других случаях миллионы паролей, адресов электронной почты и данные кредитных карт становились общедоступными, подвергая пользователей веб-сайта личному смущению или к финансовым рискам.
Цель веб-безопасности заключается в предотвращении этих (или других) видов атак. Более формальным определением веб-безопасности является: способы защиты веб-сайтов от несанкционированного доступа, использования, изменения, уничтожения или нарушения работы.
В оставшейся части этой статьи мы рассмотрим более подробную информацию о некоторых самых распространённых угрозах и о простых шагах, которые вы можете предпринять, чтобы защитить свой сайт.
Примечание: Это вводная статья, призванная помочь вам задуматься о безопасности веб-сайта, но она не является исчерпывающей.
Угрозы безопасности сайта
В этом разделе перечислены лишь некоторые из наиболее распространённых угроз веб-сайта и способы их устранения. Читая, обратите внимание на то, насколько успешны угрозы, когда веб-приложение доверяет, либо недостаточно параноидально относится к данным, поступающим из браузера.
Межсайтовый скриптинг (XSS)
Примечание: Уязвимости XSS исторически встречались чаще, чем любые другие виды угроз безопасности.
Уязвимости XSS делятся на отражённые и хранимые, в зависимости от того, как сайт возвращает внедрённый код в браузер.
Постоянная уязвимость XSS возникает, когда вредоносный скрипт хранится на веб-сайте, а затем снова отображается без изменений, чтобы другие пользователи могли выполнять его невольно.
Хотя данные из запросов POST или GET являются наиболее распространённым источником уязвимостей XSS, любые данные из браузера потенциально уязвимы, такие как данные cookie, отображаемые браузером, или пользовательские файлы, которые загружаются и отображаются.
Наилучшей защитой от уязвимостей XSS является удаление или отключение любой разметки, которая потенциально может содержать инструкции по запуску кода. Для HTML это включает такие элементы, как
Процесс изменения пользовательских данных, чтобы их нельзя было использовать для запуска сценариев или иным образом влиять на выполнение серверного кода, называется очисткой ввода. Многие веб-фреймворки автоматически очищают пользовательский ввод от HTML-форм по умолчанию.
SQL injection
Уязвимости SQL-инъекций позволяют злоумышленникам выполнять произвольный код SQL в базе данных, позволяя получать, изменять или удалять данные независимо от разрешений пользователя. Успешная инъекционная атака может подделать удостоверения, создать новые удостоверения с правами администратора, получить доступ ко всем данным на сервере или уничтожить / изменить данные, чтобы сделать их непригодными для использования.
Типы внедрения SQL включают внедрение SQL на основе ошибок, внедрение SQL на основе логических ошибок и внедрение SQL на основе времени.
statement userName
users name users userinfo
Чтобы избежать такого рода атак, вы должны убедиться, что любые пользовательские данные, которые передаются в запрос SQL, не могут изменить природу запроса. Один из способов сделать это – экранировать все символы пользовательского ввода, которые имеют особое значение в SQL.
Примечание. Инструкция SQL обрабатывает символ ‘ как начало и конец строкового литерала. Поместив обратную косую черту перед этим символом (\ ‘), мы экранируем символ и говорим SQL вместо этого трактовать его как символ (только часть строки).
В следующей инструкции мы экранируем символ ‘. Теперь SQL будет интерпретировать имя как всю строку, выделенную жирным шрифтом (это действительно очень странное имя, но безопасное).
users name
Веб-фреймворки будут часто заботиться о зарезервированных символах для вас. Django, например, гарантирует, что любые пользовательские данные, передаваемые в наборы запросов (модельные запросы), будут экранируются.
Примечание: этот раздел в значительной степени основан на информации из Wikipedia.
Подделка межсайтовых запросов (CSRF)
CSRF-атаки позволяют злоумышленнику выполнять действия, используя учётные данные другого пользователя, без его ведома или согласия.
В результате любой пользователь, который нажимает кнопку Отправить во время входа на торговый сайт, совершает транзакцию. Джон становится богатым.
Примечание: Уловка здесь в том, что Джону не нужен доступ к файлам cookie пользователя (или учётным данным). Браузер пользователя сохраняет эту информацию и автоматически включает её во все запросы к соответствующему серверу.
Один из способов предотвратить этот тип атаки – запросить сервером запросы POST, содержащие секрет, созданный пользователем для конкретного сайта. Секрет будет предоставлен сервером при отправке веб-формы, используемой для переводов. Такой подход не позволяет Джону создать свою собственную форму, потому что он должен знать секрет, который сервер предоставляет пользователю. Даже если он узнает секрет и создаст форму для конкретного пользователя, он больше не сможет использовать ту же форму для атаки на каждого пользователя.
Веб-фреймворки часто включают такие механизмы предотвращения CSRF.
Прочие угрозы
Другие распространённые атаки / уязвимости включают:
Несколько ключевых сообщений
Почти все эксплойты безопасности, описанные в предыдущих разделах, успешны, когда веб-приложение доверяет данным из браузера. Что бы вы ни делали для повышения безопасности своего веб-сайта, вы должны дезинфицировать все данные, исходящие от пользователей, прежде чем они будут отображаться в браузере, использоваться в запросах SQL или передаваться в вызов операционной системы или файловой системы.
Вы можете предпринять ряд других конкретных шагов:
- Используйте более эффективное управление паролями. Поощряйте регулярную смену надёжных паролей. Рассмотрите возможность двухфакторной аутентификации для вашего сайта, чтобы в дополнение к паролю пользователь должен был ввести другой код аутентификации (обычно тот, который доставляется через какое-то физическое оборудование, которое будет иметь только пользователь, например, код в SMS, отправленном на его телефон).
- Настройте свой веб-сервер для использования HTTPS и HTTP Strict Transport Security (HSTS). HTTPS шифрует данные, передаваемые между вашим клиентом и сервером. Это гарантирует, что учётные данные для входа, файлы cookie, данные запросов
POST
и информация заголовка не будут легко доступны для злоумышленников. - Следите за наиболее популярными угрозами (текущий список OWASP находится здесь) и в первую очередь устраняйте наиболее распространённые уязвимости.
- Используйте инструменты сканирования уязвимостей, чтобы выполнить автоматическое тестирование безопасности на вашем сайте. Позже ваш очень успешный веб-сайт может также обнаруживать ошибки, предлагая вознаграждение за обнаружение ошибок, как это делает здесь Mozilla.
- Храните и отображайте только те данные, которые вам нужны. Например, если ваши пользователи должны хранить конфиденциальную информацию, такую как данные кредитной карты, отображайте часть номера карты только для того, чтобы он мог быть идентифицирован пользователем, и недостаточно, чтобы его мог скопировать злоумышленник и использовать на другом сайте. Самый распространённый шаблон в настоящее время – отображение только последних 4 цифр номера кредитной карты.
Веб-фреймворки могут помочь смягчить многие из наиболее распространённых уязвимостей.
Резюме
В этой статье объясняется концепция веб-безопасности и некоторые из наиболее распространённых угроз, от которых ваш веб-сайт должен пытаться защититься. Самое главное, вы должны понимать, что веб-приложение не может доверять никаким данным из веб-браузера. Все пользовательские данные должны быть очищены перед отображением или использованием в SQL-запросах и вызовах файловой системы.
Этой статьёй вы подошли к концу этого модуля, охватывающего ваши первые шаги в программировании на стороне сервера. Мы надеемся, что вам понравилось изучать эти фундаментальные концепции, и теперь вы готовы выбрать веб-платформу и начать программировать.
В этом модуле
Курс Риты Дашкевич «Мыловар»
Пройди путь от любителядо востребованного профессионала за 2 месяца
Для кого я создала этот курс
Вам обязательно нужно пройти, если:
И вы хотите в нем развиваться
Мечтаете заниматься любимым делом
И ищете способ реализовать себя в творчестве
Устали от скучной работы и ежедневной рутины
Хотите не просто варить мыло, а создавать что-то оригинальное
Устали искать рецепты в интернете
И разочаровываться в их неточностях
Хотите получить ответы на все свои вопросы
● 4 года практического опыта
● Превратила мыловарение из хобби в профессию
● Основатель и ведущий преподаватель Школы мыла Риты Дашкевич
● Под чутким руководством выпущено более 500 учеников
Сегодня ШКОЛА МЫЛА РИТЫ ДАШКЕВИЧ это:
Онлайн-школа для мыловаровНаши выпускницы варят авторское мыло по всему мируГермания, Австралия, Италия, Испания, Украина, Беларусь.
Более 600 тыс. подписчиков в ТикТок @privet_bukett
Уникальные рецептурыКаждый рецепт нашей школы создан с ювелирной точностью и любовью
Непрерывная поддержка учениковКак во время обучения, так и после – мы поддерживаем своих учеников и оперативно отвечаем на любые вопросы
Продолжительность курсас кураторской поддержкой в чате
Мастер-класса по изготовлению мыла
С проверкой домашних заданий и обратной связью
Доступ к материалам курса
Рекомендованный список материалов и инструментов для прохождения курса. Видео уроки, конспекты в PDF
Урок 1
- Инвентарь мыловара: все необходимые инструменты и материалы для работы. Ничего лишнего.
- Все об ингредиентах. Конкретные производители и ингредиенты, необходимые для прохождения курса.
- Как правильно выбирать формы, упаковку, декор.
- Контакты магазинов. (Самые выгодные цены, широкий ассортимент и высокое качество)
Урок 2
- Мыло из основы: ингредиенты, материалы, упаковка (как правильно выбирать, какие имеют свойства и различия).
Урок 3
- Мыло с нуля: инструменты, ингредиенты, материалы, техника безопасности.
- Технологии изготовления мыла с нуля. Срок годности и хранение. Мыльный калькулятор. Популярные ошибки.
Мыло из основы (из натуральных ингредиентов)
Колористика. Составление композиций.
Урок 4
- Правила составления композиций (букеты, цветочные коробочки, подарочные боксы и др.)
- Разбор конкретных примеров и ошибок.
- Дизайны и эскизы для работ. Референсы.
Урок 5
- Как работать с пигментами и красителями (теория)
- Примеры подбора цвета (более 20 популярных оттенков)
- Колористика и правила сочетания цветов. Разбор частых ошибок.
Урок 8
- Основы флористики (виды букетов, пропорции, сочетание цветов, форм, линий и др.)
- Популярные ошибки.
Урок 9
- Практика. Букеты из мыла
- Практика. Корзина десертов
Урок 10
- Упаковка:
- Подарочная упаковка букета.
- Упаковка при отправке по миру
*Бонусный урок: изготовление силиконовых форм
Изготовление натурального мыла (практика). Фотосъёмка.
Урок 6
- Практика. Мыло с нуля Холодный способ
- Практика. Мыло с нуля Горячий способ
+ рецепты самых популярных сортов мыла: соляное, марсельское, хозяйственное и др.
Урок 7
- Предметная фотосъёмка. Фотозона и фотореквизит. Разбор популярных ошибок.
- Правила составления фотокомпозиций. Ракурсы и планы.
- Использование телефона для фотосъёмки. Обработка фотографий
Правила упаковки. Отработка практических навыков.
Изготовление натуральной косметики
Урок 11
- Скраб для тела Рафаэлло
- Бомбочки для ванны
- Воск для ногтей
- Бальзам для губ
Урок 19Воронка продажУрок 20Типы постов и контент-планаУрок 21Копирайтинг основы. Правила создания продающих постов.
Результат: вы разобрались в принципе построения воронки продаж, выполнили ДЗ по написанию контент-плана, разобрались в принципах составления продающих текстов.
*Бонусный урок: сертификация продукции и формы налогообложения.
· Дополнительные вебинары от маркетолога и психолога школы. Регулярные прямые эфиры.
Антикризисные меры: Как и за счет чего снизить себестоимость композиций, не потеряв в качестве товара и его внешнем виде.
Секретный рецепт изготовления мыла с нуля с низкой себестоимостью, а это значит больше доходКак экономить на упаковочных материалах и за счет чего увеличивать прибыль
Правила оформления визуала
Урок 12.Анализ рынка, конкурентов.Урок 13.Анализ ЦА.Урок 14.Составление продуктовой линейки.Урок 15.Расчет себестоимости и ценообразование.Урок 16.Основы работы в соцсетяхПозиционирование и оформление страницы.Урок 17.Тренинг по продажамУрок 18.Урок по работе в ВК, урок по созданию и контента для Тик Ток, урок попродвижению в Яндекс Дзен
Изучение и анализ ЦА.Работа в соцсетях: ВК,Тик Ток, Яндекс Дзен и проч.
Запишитесь на курс прямо сейчас:
Модуль №1: Мыло из основы. Мыло с нуля (из натуральных ингредиентов)Уроки 2, 3Модуль №2: Колористика. Составление композиций.Модуль №3: Изготовление натурального мыла (практика). ФотосъемкаМодуль №4: Правила упаковки. Отработка практических навыковУроки 8, 9,10 +бонусныйМодуль №5: Изготовление натуральной косметики
Рецепты мыла, секреты от кураторов. Видеодемонстрации всех этапов приготовления6 месяцев доступ к урокам и материалам2 месяца проверка домашки и обратная связь от преподавателей на платформе2 месяца закрытый чат с кураторами и еженедельные созвоны
Внимание!
Время скидки ограничено!
До завершения действия скидок осталось:
Весь пакет START +Модуль №6: Изучение и анализ ЦА. Работа в соцсетях: ВК, ТикТок, Яндекс Дзен и проч. (7 уроков)Модуль №7: Правила оформления визуала+ бонусный урок: Сертификация продукции и формы налогообложенияМодуль №8: Антикризисные меры: Как и за счет чего снизить себестоимость. Секретный рецепт изготовления мыла с нуля с низкой себестоимостью
Рецепты мыла, секреты от кураторов. Видеодемонстрации всех этапов приготовления6 месяцев доступ к урокам и материалам2 месяца проверка домашки и обратная связь от преподавателей на платформе2 месяца закрытый чат с кураторами и еженедельные созвоны
Предобучение: Рекомендованный список материалов и инструментов для прохождения курса.Видео-уроки, конспекты в pdf
Модуль №1: Мыло из основы. Ингредиенты, материалы, упаковка (как правильно выбрать, какие имеют свойства и различия)Урок 2Модуль №2: Колористика. Составление композиций.Модуль №4: Отработка практических навыковУроки 8, 9
Рецепты мыла, секреты от кураторов. Видеодемонстрации всех этапов приготовления6 месяцев доступ к урокам и материалам2 месяца обратная связь и проверка домашних заданий на платформе
Уроки по базовым навыкам мыловарения
Для старта бизнеса на мыловарении
Предобучение: Рекомендованный список материалов и инструментов для прохождения курса.Видео-уроки, конспекты в pdf
Предобучение: Рекомендованный список материалов и инструментов для прохождения курса.Видео-уроки, конспекты в pdf
Чтобы было комфортно проходить обучение, есть возможность оплачивать на частям
Если у вас остались вопросы, вы можете задать их в любое время по кнопке ниже!
Мы с радостью вам поможем!
ИП ДАШКЕВИЧ МАРГАРИТА ЮРЬЕВНА
Реквизиты (ОГРНИП / ИНН): ОГРНИП: / ИНН: 321169000183322 / 165126024850
Адрес: 423552, ТАТАРСТАН РЕСП, НИЖНЕКАМСКИЙ Р-Н, П КРАСНЫЙ КЛЮЧ, УЛ СОВЕТСКАЯ, дом 21, кв. 52
Договор оферты
Политика конфиденциальности
Эл. почта: hello.shkolamila@yandex.ru
Создание проекта и подключение зависимостей
Итак, мы готовы, чтобы написать обещанное простое приложение с регистрацией и входом в учетную запись пользователя. Используемые технологии: Spring Boot, Spring Security, Spring Data JPA, Hibernate, MySQL, JSP, Bootstrap и Docker Compose.
Создание проекта
Структура проекта должна выглядеть так:
├── src │ └── main │ ├── java │ │ └── com │ │ └── hellokoding │ │ └── auth │ │ ├── model │ │ │ ├── Role.java │ │ │ └── User.java │ │ ├── repository │ │ │ ├── RoleRepository.java │ │ │ └── UserRepository.java │ │ ├── service │ │ │ ├── SecurityServiceImpl.java │ │ │ ├── SecurityService.java │ │ │ ├── UserDetailsServiceImpl.java │ │ │ ├── UserServiceImpl.java │ │ │ └── UserService.java │ │ ├── validator │ │ │ └── UserValidator.java │ │ ├── web │ │ │ └── UserController.java │ │ ├── WebApplication.java │ │ └── WebSecurityConfig.java │ ├── resources │ │ ├── application.properties │ │ └── validation.properties │ └── webapp │ ├── resources │ │ ├── css │ │ │ ├── bootstrap.min.css │ │ │ └── common.css │ │ └── js │ │ └── bootstrap.min.js │ ├── login.jsp │ ├── registration.jsp │ └── welcome.jsp ├── Dockerfile ├── docker-compose.yml └── pom.xml
Добавление зависимостей
Содержимое файла pom.xml:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.hellokoding.springboot</groupId> <artifactId>springboot-registration-login</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.3.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Определение объектов JPA и Hibernate
Содержимое файла User.java
:
package com.hellokoding.auth.model; import javax.persistence.*; import java.util.Set; @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; @Transient private String passwordConfirm; @ManyToMany private Set<Role> roles; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getPasswordConfirm() { return passwordConfirm; } public void setPasswordConfirm(String passwordConfirm) { this.passwordConfirm = passwordConfirm; } public Set<Role> getRoles() { return roles; } public void setRoles(Set<Role> roles) { this.roles = roles; } }
Содержимое файла Role.java:
package com.hellokoding.auth.model; import javax.persistence.*; import java.util.Set; @Entity @Table(name = "role") public class Role { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; @ManyToMany(mappedBy = "roles") private Set<User> users; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Set<User> getUsers() { return users; } public void setUsers(Set<User> users) { this.users = users; } }
Использование репозиториев Spring Data JPA
Репозитории помогают сократить шаблонный код, который необходим для реализации уровней доступа к данным в разных хранилищах — MySQL, PostgreSQL и других. В них описываются некоторые функции для создания, чтения, обновления и удаления данных из БД — например, findAll, findById, save, saveAll, delete и deleteAll.
Файл UserRepository.java
:
package com.hellokoding.auth.repository; import com.hellokoding.auth.model.User; import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User, Long> { User findByUsername(String username); }
Файл RoleRepository.java
:
package com.hellokoding.auth.repository; import com.hellokoding.auth.model.Role; import org.springframework.data.jpa.repository.JpaRepository; public interface RoleRepository extends JpaRepository<Role, Long>{ }
Определение UserDetailsService Spring Security
Для использования аутентификации с помощью Spring Security нужно реализовать интерфейс org.springframework.security.core.userdetails.UserDetailsService
.
Файл UserDetailsServiceImpl.java
:
package com.hellokoding.auth.service; import com.hellokoding.auth.model.Role; import com.hellokoding.auth.model.User; import com.hellokoding.auth.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.HashSet; import java.util.Set; @Service public class UserDetailsServiceImpl implements UserDetailsService{ @Autowired private UserRepository userRepository; @Override @Transactional(readOnly = true) public UserDetails loadUserByUsername(String username) { User user = userRepository.findByUsername(username); if (user == null) throw new UsernameNotFoundException(username); Set<GrantedAuthority> grantedAuthorities = new HashSet<>(); for (Role role : user.getRoles()){ grantedAuthorities.add(new SimpleGrantedAuthority(role.getName())); } return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), grantedAuthorities); } }
Создание сервиса безопасности
Сервис безопасности нужен для предоставления текущего авторизованного пользователя и автоматического входа в систему после регистрации.
SecurityService.java: package com.hellokoding.auth.service; public interface SecurityService { String findLoggedInUsername(); void autoLogin(String username, String password); } SecurityServiceImpl.java: package com.hellokoding.auth.service; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.stereotype.Service; @Service public class SecurityServiceImpl implements SecurityService{ @Autowired private AuthenticationManager authenticationManager; @Autowired private UserDetailsService userDetailsService; private static final Logger logger = LoggerFactory.getLogger(SecurityServiceImpl.class); @Override public String findLoggedInUsername() { Object userDetails = SecurityContextHolder.getContext().getAuthentication().getDetails(); if (userDetails instanceof UserDetails) { return ((UserDetails)userDetails).getUsername(); } return null; } @Override public void autoLogin(String username, String password) { UserDetails userDetails = userDetailsService.loadUserByUsername(username); UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(userDetails, password, userDetails.getAuthorities()); authenticationManager.authenticate(usernamePasswordAuthenticationToken); if (usernamePasswordAuthenticationToken.isAuthenticated()) { SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken); logger.debug(String.format("Auto login %s successfully!", username)); } } }
Создание службы пользователя
Также нужно создать службу для регистрации пользователей.
UserService.java: package com.hellokoding.auth.service; import com.hellokoding.auth.model.User; public interface UserService { void save(User user); User findByUsername(String username); } UserServiceImpl.java: package com.hellokoding.auth.service; import com.hellokoding.auth.model.User; import com.hellokoding.auth.repository.RoleRepository; import com.hellokoding.auth.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import java.util.HashSet; @Service public class UserServiceImpl implements UserService { @Autowired private UserRepository userRepository; @Autowired private RoleRepository roleRepository; @Autowired private BCryptPasswordEncoder bCryptPasswordEncoder; @Override public void save(User user) { user.setPassword(bCryptPasswordEncoder.encode(user.getPassword())); user.setRoles(new HashSet<>(roleRepository.findAll())); userRepository.save(user); } @Override public User findByUsername(String username) { return userRepository.findByUsername(username); } }
Определение валидатора
Входные данные будет проверять валидатор. Коды ошибок определяются в validation.properties.
UserValidator.java: package com.hellokoding.auth.validator; import com.hellokoding.auth.model.User; import com.hellokoding.auth.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.validation.Errors; import org.springframework.validation.ValidationUtils; import org.springframework.validation.Validator; @Component public class UserValidator implements Validator { @Autowired private UserService userService; @Override public boolean supports(Class<?> aClass) { return User.class.equals(aClass); } @Override public void validate(Object o, Errors errors) { User user = (User) o; ValidationUtils.rejectIfEmptyOrWhitespace(errors, "username", "NotEmpty"); if (user.getUsername().length() < 6 || user.getUsername().length() > 32) { errors.rejectValue("username", "Size.userForm.username"); } if (userService.findByUsername(user.getUsername()) != null) { errors.rejectValue("username", "Duplicate.userForm.username"); } ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "NotEmpty"); if (user.getPassword().length() < 8 || user.getPassword().length() > 32) { errors.rejectValue("password", "Size.userForm.password"); } if (!user.getPasswordConfirm().equals(user.getPassword())) { errors.rejectValue("passwordConfirm", "Diff.userForm.passwordConfirm"); } } }
Настройка контроллеров
UserController.java: package com.hellokoding.auth.web; import com.hellokoding.auth.model.User; import com.hellokoding.auth.service.SecurityService; import com.hellokoding.auth.service.UserService; import com.hellokoding.auth.validator.UserValidator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; @Controller public class UserController { @Autowired private UserService userService; @Autowired private SecurityService securityService; @Autowired private UserValidator userValidator; @GetMapping("/registration") public String registration(Model model) { model.addAttribute("userForm", new User()); return "registration"; } @PostMapping("/registration") public String registration(@ModelAttribute("userForm") User userForm, BindingResult bindingResult) { userValidator.validate(userForm, bindingResult); if (bindingResult.hasErrors()) { return "registration"; } userService.save(userForm); securityService.autoLogin(userForm.getUsername(), userForm.getPasswordConfirm()); return "redirect:/welcome"; } @GetMapping("/login") public String login(Model model, String error, String logout) { if (error != null) model.addAttribute("error", "Your username and password is invalid."); if (logout != null) model.addAttribute("message", "You have been logged out successfully."); return "login"; } @GetMapping({"/", "/welcome"}) public String welcome(Model model) { return "welcome"; } }
POST-контроллер /login определять не нужно. Его по умолчанию предоставляет Spring Security.
Шаблоны просмотра JSP (Bootstrap)
Здесь достаточно трех файлов: для регистрации, входа и приветствия.
Registration.jsp: <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <c:set var="contextPath" value="${pageContext.request.contextPath}"/> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Create an account</title> <link data-hren="${contextPath}/resources/css/bootstrap.min.css" rel="stylesheet"> <link data-hren="${contextPath}/resources/css/common.css" rel="stylesheet"> </head> <body> <div class="container"> <form:form method="POST" modelAttribute="userForm" class="form-signin"> <h2 class="form-signin-heading">Create your account</h2> <spring:bind path="username"> <div class="form-group ${status.error ? 'has-error' : ''}"> <form:input type="text" path="username" class="form-control" placeholder="Username" autofocus="true"></form:input> <form:errors path="username"></form:errors> </div> </spring:bind> <spring:bind path="password"> <div class="form-group ${status.error ? 'has-error' : ''}"> <form:input type="password" path="password" class="form-control" placeholder="Password"></form:input> <form:errors path="password"></form:errors> </div> </spring:bind> <spring:bind path="passwordConfirm"> <div class="form-group ${status.error ? 'has-error' : ''}"> <form:input type="password" path="passwordConfirm" class="form-control" placeholder="Confirm your password"></form:input> <form:errors path="passwordConfirm"></form:errors> </div> </spring:bind> <button class="btn btn-lg btn-primary btn-block" type="submit">Submit</button> </form:form> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> <script src="${contextPath}/resources/js/bootstrap.min.js"></script> </body> </html> Login.jsp: <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <c:set var="contextPath" value="${pageContext.request.contextPath}"/> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Log in with your account</title> <link data-hren="${contextPath}/resources/css/bootstrap.min.css" rel="stylesheet"> <link data-hren="${contextPath}/resources/css/common.css" rel="stylesheet"> </head> <body> <div class="container"> <form method="POST" action="${contextPath}/login" class="form-signin"> <h2 class="form-heading">Log in</h2> <div class="form-group ${error != null ? 'has-error' : ''}"> <span>${message}</span> <input name="username" type="text" class="form-control" placeholder="Username" autofocus="true"/> <input name="password" type="password" class="form-control" placeholder="Password"/> <span>${error}</span> <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> <button class="btn btn-lg btn-primary btn-block" type="submit">Log In</button> <h4 class="text-center"><a data-hren="${contextPath}/registration">Create an account</a></h4> </div> </form> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> <script src="${contextPath}/resources/js/bootstrap.min.js"></script> </body> </html> Welcome.jsp: <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:set var="contextPath" value="${pageContext.request.contextPath}"/> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Create an account</title> <link data-hren="${contextPath}/resources/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container"> <c:if test="${pageContext.request.userPrincipal.name != null}"> <form id="logoutForm" method="POST" action="${contextPath}/logout"> <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/> </form> <h2>Welcome ${pageContext.request.userPrincipal.name} | <a onclick="document.forms['logoutForm'].submit()">Logout</a></h2> </c:if> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script> <script src="${contextPath}/resources/js/bootstrap.min.js"></script> </body> </html>
Определение свойств
Validation.properties: NotEmpty=This field is required. Size.userForm.username=Please use between 6 and 32 characters. Duplicate.userForm.username=Someone already has that username. Size.userForm.password=Try one with at least 8 characters. Diff.userForm.passwordConfirm=These passwords don't match. Application.properties: spring.datasource.url=jdbc:mysql://hk-mysql:3306/test?useSSL=false spring.datasource.username=root spring.datasource.password=hellokoding spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.hibernate.ddl-auto=create spring.jpa.database-platform=org.hibernate.dialect.MySQL57Dialect spring.jpa.generate-ddl=true spring.jpa.show-sql=true spring.mvc.view.prefix: / spring.mvc.view.suffix: .jsp spring.messages.basename=validation
Конфигурация веб-безопасности
WebSecurityConfig.java: package com.hellokoding.auth; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Qualifier("userDetailsServiceImpl") @Autowired private UserDetailsService userDetailsService; @Bean public BCryptPasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder(); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/resources/**", "/registration").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); } @Bean public AuthenticationManager customAuthenticationManager() throws Exception { return authenticationManager(); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder()); } }
Конфигурация приложения
WebApplication.java: package com.hellokoding.auth; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication public class WebApplication { public static void main(String[] args) throws Exception { SpringApplication.run(WebApplication.class, args); } }
Запуск Docker-контейнера
Подготовьте Dockerfile для приложения Java / Spring Boot и файл docker-compose.yaml для MySQL Server.
Содержимое Dockerfile:
FROM maven:3.5-jdk-8
Содержимое docker-compose.yml
:
version: '3' services: hk-mysql: container_name: hk-mysql image: mysql/mysql-server:5.7 environment: MYSQL_DATABASE: test MYSQL_ROOT_PASSWORD: hellokoding MYSQL_ROOT_HOST: '%' ports: - "3306:3306" restart: always registration-login: build: . volumes: - .:/app - ~/.m2:/root/.m2 working_dir: /app ports: - 8080:8080 command: mvn clean spring-boot:run depends_on: - hk-mysql
Перейдите в корень проекта и запустите Docker:
docker-compose up
Тестирование
Чтобы запустить приложение на локальном сервере MySQL, измените в application.properties «hk-mysql» на «localhost», перейдите в корневой каталог проекта и выполните команду:
mvn clean spring-boot:run
Перейдите в браузере по адресу localhost: 8080 и протестируйте приложение. Попробуйте заходить под разными пользователями, выходить, добавлять новые функции и изменять права доступа.
Исходный код нашего проекта — в репозитории на GitHub.
Организаторы и партнёры
Группа компаний «Просвещение»
Центр экстренной психологической помощи МЧС России
Всероссийское добровольное пожарное общество
Центр организации дорожного движения Правительства Москвы
Экспертные системы мониторинга и анализа СМИ и соцмедиа
Проект ГЕРОИ
Информационный партнер
ФИЦ питания и биотехнологии
Растим детей
Добрая Дорога Детства
Digital Спасатель
Всероссийский урок безопасности — лауреат II степени всероссийской премии «Золотой медвежонок» в номинации «Устойчивое развитие, КСО и благотворительность»
Пример подключения Spring Security
Посмотрим на практике, какие настройки включаются по умолчанию при добавлении в проект Spring Security.
Подготовка
Сгенерируйте на Spring Initializr приложение с зависимостью Web:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
Напишите REST
-контроллер:
@RestController public class HelloController { @GetMapping("/api/hello") public String hello(){ return "Highload"; } }
Проверьте приложение в браузере. Сейчас доступ к нему имеют все пользователи.
Подключение Spring Security
Добавьте Maven-зависимость, чтобы подключить Spring Security:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
Проверьте приложение снова. Теперь при переходе по первоначальному адресу http://localhost:8080/api/hello
мы попадем на страницу для ввода логина и пароля — http://localhost:8080/login
. Здесь размещена форма входа. Введите в нее любые данные и нажмите Sign in — появится сообщение об ошибке.
Приложение уже выполняет проверку пользователей, хотя вы еще даже ничего не настраивали.
Проверка изменений
Spring Security после подключения добавляет своего пользователя. Его имя user, пароль генерируется при запуске. Кроме того, в проекте при добавлении зависимости:
- формируется страница, на которой размещена форма для ввода имени и пароля;
- сразу начинает работать проверка имени и пароля;
- все URL недоступны, пока вы не зайдете в систему под именем зарегистрированного пользователя.
Кроме страницы для входа создается страница для выхода из аккаунта. Она находится по адресу /logout.
Настройка аутентификации
Spring Security использует Form-Based-аутентификацию. Пользователь отправляет имя и пароль через форму. Сервер берет эти данные из запроса как POST-параметры.
Теперь посмотрим, как сервер хранит данные пользователей. Интересно, что они находятся не в базе, не на LDAP-сервере, а в оперативной памяти приложения. И хранятся там до тех пор, пока оно запущено. Такая аутентификация называется In-Memory authentication.
Чтобы отредактировать пользователя, необходимо заново запустить приложение. Для продакшена такой вариант не подходит, но для экспериментов в процессе разработки это простой и полезный метод.
Приложение хранит имя и пароль в памяти. Вы можете посмотреть эти данные через консоль. Чтобы каждый раз не лезть в консоль, воспользуйтесь файлом конфигурации application.yml. Зафиксируйте в нем имя и пароль пользователя.
spring: security: user: name: highload password: myhighload
Теперь пароль не будет каждый раз генерироваться заново. Аналогичным образом можно задать других пользователей. Это полезно для будущей проверки разграничения прав доступа.
Чтобы настроить In-Memory-аутентификацию, создайте класс SecurityConfig
, который расширяет класс @EnableWebSecurity
. Вот полный код:
@EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder passwordEncoder() { return NoOpPasswordEncoder.getInstance(); } @Override public void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("highload") .password("myhighload") .authorities("ROLE_USER") .and() .withUser("highload2") .password("myhighload2") .authorities("ROLE_USER"); } }
Теперь — пояснения. Здесь вы переопределяете метод configure AuthenticationManagerBuilder auth класса WebSecurityConfigurerAdapter, получаете доступ к билдеру AuthenticationManagerBuilde и уже через него настраиваете нужный AuthenticationManager.
В билдере нужно задать тип аутентификации. В этом примере используется In-Memory — auth.inMemoryAuthentication(). Но может быть другой вариант — Jdbc, LDAP, кастомная аутентификация. Тип аутентификации определяет, где хранится пользователь.
Затем определяются специальные настройки AuthenticationManager. Вы уточняете, как он извлекает пользователя из хранилища, чтобы сравнить его с введенными данными. В этом случае In-Memory-аутентификация позволяет ускорить процесс. Имя и пароль заданы в том же файле.
AuthenticationManager достает не только имя и пароль, но и разрешения пользователя — authorities("ROLE_USER"
).
Что в итоге делает приведенный выше фрагмент кода:
- Сравнивает переданные имя и пароль со значениями имени и пароля, которые хранятся в оперативной памяти.
- При совпадении данные аутентификация проходит успешно.
Обратите также внимание на бин PasswordEncoder. В нем указано, как шифровать пароль. В приведенном выше примере пароль не шифруется. Так можно делать только на учебных проектах для наглядности. В реальном приложении NoOpPasswordEncoder не используется.
Готовые уроки безопасности помогут узнать больше
I модуль. «В начале о самом важном» (1–6 сентября 2022)
ОБНОВЛЕНО
Противодействие терроризму
ОБНОВЛЕНО
Правила дорожного движения
ОБНОВЛЕНО
Оказание первой помощи
II модуль. «Личная безопасность» (7–11 ноября 2022)
ОБНОВЛЕНО
Безопасность в социуме
НОВЫЙ УРОК
Здоровый образ жизни
III модуль. «Финансовая безопасность» (30 января–3 февраля 2023)
НОВЫЙ УРОК
Финансовая безопасность
ОБНОВЛЕНО
Информационная безопасность
IV модуль. «Безопасность в современном мире» (30 января–3 февраля 2023)
ОБНОВЛЕНО
Противопожарная безопасность
Зачем принимать участие в уроке безопасности?
Чтобы узнать:
- Как действовать при чрезвычайных ситуациях и террористических атаках?
- Какие правила дорожного движения необходимо знать всем?
- Я и социум. Как вести себя с окружающими, чтобы не попасть в беду?
- Основные правила финансовой и информационной безопасности?
- Как жить здоровой жизнью без зависимостей и вредных привычек?
Участвуйте с нами: скачивайте материалы, смотрите видео, знакомьтесь с базовыми правилами защиты. Затем пройдите тест и будьте уверены в своих знаниях!
И помните: личная безопасность — в руках каждого из нас!Примите участие в акции УРОКБЕЗОПАСНОСТИ.РФ
Уроки БезОпасности
Организатор проекта
Основной регион: Ростовская область
Охват проекта по регионам: Ростовская область
Описание
Проект направлен на профилактику негативных явлений в молодежной среде путем вовлечения в добровольческую (волонтерскую) деятельность и популяризацию культуры безопасности среди населения Ростовской области.
Проект включает в себя образовательную площадку, в которой планируется участие более 100 тысяч граждан Ростовской области и доступную для участников в возрасте от 7 лет. По итогам реализации проекта прогнозируется повышение у детей и подростков уровня знаний и навыков в области пожарной безопасности, навыков оказания первой помощи и поведения в непредвиденных ситуациях.
Показать полностью
Цели проекта
Формирование культуры безопасности жизнедеятельности, обучение детей, подростков и взрослых грамотным действиям в опасных и чрезвычайных ситуациях.
Показать полностью
Результаты проекта
В рамках реализации проекта на сайте урокибезопасности.рф функционирует образовательная площадка в виде онлайн-игры, по прохождению которой каждый участник получает сертификат волонтера-спасателя. Онлайн-игра рассчитала на две возрастные категории: «Квест через стихии» для участников в возрасте от 7 до 13 лет; «Покорение стихий» для участников в возрасте от 14 лет. Во время онлайн-игры каждый гражданин, ответив на вопросы, сможет узнать, как оказать первую помощь, как работать с огнетушителем и защитить себя и своих близких в ситуациях, угрожающих жизни человека. В настоящее время общий охват участников, прошедших онлайн-игру, составляет более 32 000 человек.
Также амбассадорами Ростовской области и Ростовское РО РОССОЮЗСПАС проведено более 200 выездных теоретических и практических занятий с общим охватом участников более 5 000 человек.
Планируется участие более 100 тысяч граждан Ростовской области в возрасте от 7 лет. По итогам реализации проекта прогнозируется повышение у детей и подростков уровня знаний и навыков в области пожарной безопасности, навыков оказания первой помощи и поведения в непредвиденных ситуациях.
1 октября 2021 года для участников онлайн-игры в рамках Проекта дан старт конкурсу «Уроки БезОпасности».
Показать полностью
Теги
Партнёры проекта
Всероссийский урок безопасности
Банк ресурсов и тестов для педагогов и школьников.
Разработан авторами ведущих отечественных проектов по наиболее актуальным тематикам ОБЖ.
Больше материалов для организации воспитательной работы и внеурочных занятий в школе доступно в цифровом сервисе «ПРОвоспитание».
Рекомендуем
«Основы безопасности жизнедеятельности являются базовыми знаниями влияющими на безопасность и обороноспособность населения и страны».
Скворцов Владислав Александрович
к.п.н., преподаватель и эксперт по поисково-спасательной деятельности
Учителям и организаторам урока
(учителям 1-11 классов, педагогам по внеурочной деятельности)
5 простых правил проведения Урока безопасности
- Пригласите учеников. В вашем личном кабинете скопируйте ссылку-приглашение и отправьте детям.
- Проведите урок или внеклассное мероприятие. Онлайн или очно. Используйте готовые методические материалы из вашего личного кабинета. Выбор за вами: рассмотреть одну или несколько тем.
- Закрепите теорию тестом.
- Онлайн — ученики пройдут на сайт по ссылке-приглашению и выполнят тест. Результат теста появится автоматически.
- Очно — скачайте тесты для печати, раздайте ученикам для выполнения, затем введите полученные результаты на сайт.
- Скачайте сертификаты участника на себя и на каждого ученика.
Ученикам и всем желающим
(ученикам, родителям и тем, кому интересно)
Проверьте и закрепите свои знания. Всего 4 простых шага!
- на Урок безопасности.
- Изучите материалы. Они выложены в вашем личном кабинете.
- Пройдите тестирование по одной или нескольким темам.
- Скачайте сертификаты на себя и на каждого ученика.
Итоги
В этой статье мы познакомились с основами Spring Security и разобрали основные возможности этого фреймворка. Не ограничивайтесь теорией. Попробуйте собрать собственное простое приложение с регистрацией и аутентификацией.
Для закрепления материала также посмотрите этот тематический видеокурс: