Spring Boot Security: добавляем регистрацию и авторизацию пользователей в приложение (простой сайт)
ฝัง
- เผยแพร่เมื่อ 13 ต.ค. 2024
- Spring Boot Web Application (MVC): Добавляем Spring Security (пользователи и авторизация) в приложение. Когда в прложении работает несколько пользователей, им необходимо разделять свои данные. Для решения этой проблемы мы создаём пользовательские аккаунты и применяем для этого фреймворк Spring Security.
Поддержать проект:
➡ Стать спонсором www.youtube.co...
➡ Patreon / letscodedru
➡ Яндекс.Деньги money.yandex.r...
➡ PayPal paypal.me/letscodedru
➡ Qiwi qiwi.me/letscode
Ссылка на git репозиторий из видео:
github.com/dru...
Для начала нам необходимо найти нужный гайд на сайте Spring:
spring.io/guid...
Следуя руководству, нам необходимо сделать 2 страницы: публичную, роль которой у нас возьмет на себя страница greetings, и доступная после авторизации, роль которой возьмет на себя страница main. Нам потребуется только немного изменить мэппинг страниц и добавить ссылку с главной на приватную страницу.
Далее мы подключаем зависимость Spring Security, настраиваем модуль вэб-безопасности, и добавляем страницу авторизации.
По умолчанию, в Spring Security включен механизм CSRF и нам необходимо передавать со всеми формами ключ защиты. Для этого в файле настроек приложения application.properties нужно добавить строку настройки из блокнота:
gist.github.co...
В результате мы имеем простейший механизм авторизации в приложении. Проблема в том, что он использует фиксированные учетные записи, хранящиеся в оперативной памяти и все данные пользователей открыто лежать в исходном коде.
Для добавления возможности хранения учетных записей пользователей в БД, нам нужно изменить настройки Spring Security и создать доменный класс пользователя. Также, нам необходимо добавить страницу регистрации новых пользователей.
Руководство по mustache:
mustache.github...
Руководство по JPA репозиториям:
docs.spring.io...
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
➡ Твиттер: / letscodedru
➡ Чат в Discord: / discord
➡ Группа Вконтакте: letscod...
➡ Канал в Telegram: t.me/letsCode_dru
➡ Чат в Telegram: t.me/joinchat/...
➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖➖
Ссылка на плейлист:
• SDKMan: установка Java...
Ссылка на канал: / @letscodedru
Ссылка на Яндекс.Дзен: zen.yandex.ru/...
Автор молодец, объясняет кратко, доходчиво и по теме... Я последний месяц как раз начал учить спринг, в ютубе очень много видео категории г**на, где сидит чувак и откровенно сопли жует 40 минут, а тут все круто...
100% при этом видосы пятилетней давности, когда еще не было Spring Boot
@@iryna6389 Да ладно - не сильно большая разница- был boot- не было
Однозначно
Другая сторона этого "круто": если где-то опечатался - хрен когда найдёшь ошибку т.к. набирал в режиме мартышки не вникая в суть происходящего.
Всё ещё актуальные и интересные уроки, но с такой скоростью подачи автору нужно быть рэпером
Смотрю ваши ролики в 2023, спасибо за ваш труд !!!
Доступное пояснение, четкий звук, все на высшем уровне! Огромное человеческое спасибо! Ох как вовремя я попал на эти уроки
Нереальный респект автору! Такой крутой выкладки материала я еще не видел. Кратко, четко, быстро и главное по сути. 20 минут видео пролетают незаметно. Даже отображаешь на экране используемые горячие клавиши. Видно что ты с душой подходишь к делу. Удачи тебе и успехов. У тебя отлично получаеться. продолжай в том же духе!
Можно при монтаже видео, показывать что вы добавляете а то поле было user.setRoles(Collections.singleton());
а потом стало user.setRoles(Collections.singleton(Role.USER));
Сорян, стараюсь не допускать таких ляпов. Видимо, ошибка при монитаже
letsCode спасибо за понимание,буду ждать следующих выпусков)
Спасибо за исправление !))))
@@letsCodeDru что-то с запросом не то. Что такое u. и ur. в u.username и ur.role? Таблицы были названы usr и user_role. Ошибка: java.sql.SQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`testspringapp`.`user_role`, CONSTRAINT `FK859n2jvi8ivhui0rl0esws6o` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`))
Role не класс а enum типо:
package хз.где?;
public enum Role {
USER;
}
Блин, мужик, БРАВО! Я просто голову ломаю как это все понять, а ты тут так все доступно, четко и быстро объясняешь . Кайф! Топ контент )
Спасибо тебе большущее!! засмотрел видео до дыр, неважно (надеюсь) с какого раза, но смог это реализовать в своём проекте. Отдельная благодарность, что видео с современными технологиями и практиками, а не примеры 2014 года ) Подписался, буду расти с каналом (шучу, конечно же быстрее =) )
Приходится додумывать, почему в форму регистрации передаются логин и пароль, а в обработчике url мы получаем готовый объект User
так-то офигенная тема) Вы коротко создаете небольшой проект, который можно будет позже развивать, читая документацию. Это удобнее, когда у тебя есть уже какой-то велосипед, который хоть как-то ездит, и ты его начинаешь допиливать дополнительными знаниями из документации. А сухая документация что-то плохо идет.
ля, из-за mustache только больше запутался
@Boden Alvaro fuck of scam
@Ernesto Sage you too, fuck of
++, дичь полная
Да. Зря он на мусташу переключился.
Красавчик, очень полезный контент. Надеюсь канал вырастет в целую школу=)
Спасибо огромное! Уроки великолепны, все по существу. Продолжайте в том же духе, удачи Вам!
Столько инфы сразу, и все так шустро) Аж голова болеть начинает, без пережевывания не обойтись, но все ровно спасибо за материал.
Вместо configurer теперь нужно или можно использовать @Autowired
public void initialize(
AuthenticationManagerBuilder builder,
DataSource dataSource
) throws Exception {
код внутри тот же с заменой auth на builder
Спасибо большое👍
Этот комментарий должен быть вверху, спасибо большое)
Контент офигеннейший, с которым уже потом можно самостоятельно разбираться. Возможность что-то набросать внушает уверенность в своих силах, спасибо
единственное хотелось бы, чтобы чаще было переключение на проверку результата, чтобы были контрольные точки провверок того, что ненакосячил
Видео супер. Все по делу, без соплей!!! Автору огромное спасибо. Такого же плана приложение SpringBoot + Angular или ReactJS было бы, думаю, очень актуально на данный момент.
Крутой подход, спасибо автору. Следовал видео и получилось сделать
крутой проект, который любопытно "докручивать" самому. Советы автора
помогают не утонуть в деталях и не потерять мотивацию. Спасибо ребятам в
комментах - если вы напоролись на ошибку, решения находил здесь же.
Успехов!
Самый главный совет: внимательность!!! Внимательность при повторении кода держать на 200%!)
Здарова, Макс)
Ну вот где еще можно пересечься)
@@МаксимПалий-я4п Та да))
Все круто. Доступно объясняет. Не выводит сообщение при попытке добавления существующего пользователя. Спасибо за ваш труд.
Буду краток: Это лучшее что я видел по Spring'у! Объясняешь очень доходчиво!
Спасибо за урок! Конечно, очень много вопросов осталось. Но буду разбираться дальше)
Спасибо! Работаю на позиции Java Senior и даже так ваши видео очень полезны, помогают освежить память и узнать много нового.
Привет из 2022 всем, кто использует thymeleaf , в классе WebSecurityConfig необходимо в конце метода configure добавить ".and().csrf().disable();", иначе при отправке post запросов возникнет 403. Если был полезен, ставьте лукас, буду рад)))
Во-во)) Ты тоже на stackoverflow подсмотрел?))
@@ghostmyxamop600 есть такое)
Очень хороший видеоролик-урок, много́го не знал. Спасибо
О том, как сервер определяет, авторизирован ли пользователь, авторизирует и т.д., воообще не понятно, честно, метод configure слабо описан, что такое AuthenticationManagerBuilder, какие у него возможности.
Ты просто записал два скл-запросы и сказал делать так, иначе работать не будет
Те слепые пятна из статьи сайта спринга так и остались
Спасибо большое за уроки, до сих пор актуально!
Но остался один нерешенный вопрос.
Без маппинга /login - не работает страница логина. Начал разбираться в чем проблема, пришел к тому, что в MvcConfig -> метод addViewController не используется, при условии, что аннотация @Configuration присутствует.
А что тогда делать?
Отличное учебное видео-пособие!!! Респект категорически!!!
Очень крутые туториалы, удачно выбрана подача материала. Спасибо
Это было тяжело, но я справился с этим. Очень полезный контент из минусов 5 лет+)
Этот сайт сразу привлек мое внимание своим оформлением) реально классно играть здесь)
Четко и по делу , минимум воды и сразу важный функционал.Благодарю
подписался, не глядя, ибо нету современных каналов по boot, только старьё не актуальное
Ну, разобравшись со "старьём", boot заходит намного легче!..
ну посмотрев ваши ролики однозначно скажу что с нуля их смотреть не получится, я после того как выучил java core долго понимал spring, а у вас сразу с места в карьер, мне норм, а за новичков я бы сказал сложновато.
мои видео поразумевают некий бэкграунд у новичков. Цель серии видео - помочь раскачаться, начать писать хоть что-то с использованием Spring
когда смотришь по третьему кругу и пишешь одновременно код, заставляя свои мозги не тупо смотреть ,
и проявляя определенное упорство, то заходит очень даже хорошо, не сдавайся, все придет, просто не сразу
@@letsCodeDru 1, 5г назад когда только начал изучать java - вобще аут был. Когда да Spring Security досмотрел - понял что вообще труба - ничего не понимаю. Сейчас смотрю тоже видео(есть небольшой багаж знаний по java core, sql, html и web ) заходит совсем по другому. Поэтому бекграунд необходим. Я вот теперь вроде врубаюсь, что происходит даже не зная тонкостей аспектов работы Spring.
Автор! Огромнейшее спасибо!!!! Продолжайте пожалуйста!
Спасибо, очень помогает.
Все пишу руками, столько опечаток/багов у меня))))
Но это даже лучше, начинаешь ковырять код и разбираться что к чему.
Курс хороший, дает представление и общение понимание работы разных блоков Спринг. К сожалению, из-за обновлений Спринга, актуальность сейчас ограниченная. Первые 2 урока еще смог подогнать под себя, далее знаний не хватает. Подойдет тем, кто уже достаточно хорошо "шарит" в Спринг. Спасибо за курс!
Через день: пороже, я уже достаточно хорошо шару, ахах. Удалось все настроить, чтобы было в первых 3 видео. Дальше - больше :)
Не подскажешь, как настроил?)
@@ТимофійКрасько-к5г Сейчас детали уже не помню, но все ответы были в комментах под видео, кажется. Если напомните, скину на выходных. У меня была подборка правок. Отдельно стоит сказать, что версия Секьюрити здесь старая и ее нужно будет обновить, как и версию Спринг, если действительно хотите работоспособный расширяемый проект
@@movie_moment:)
Пересмотрел урок уже несколько раз и не могу понять магии переброса со страницы login на страницу main. Ведь у нас в login.mustache в форме - action="/login" (т.е. переадресация обратно на страницу логина). Или я что-то не так понимаю.Дело в том я вообще после ввода пароля, логина остаюсь на странице /login , подскажите пожалуйста как решить
в спринге уже реализованы контроллеры логина на методы post и get, как видно в хтмл коде форма отправляет пост запрос, значит если данные в бд с таким логином и паролем нашлись, тогда пользователя авторизовывает и кидает на мэйн, в другом случае просто остается.
Здравствуйте ! Большое спасибо за это видео ! Низкий поклон Вам !
Автор, огромное спасибо, все очень доходчиво и понятно.
Нихрена ничего не понятно
@@kisurov мужчина, в русском сегменте автор один из лучших, если не лучший. Да, чтобы понимать его уроки базовые знания спринга и web у тебя обязаны быть. Совсем с нуля ты спринг по этим урокам не освоишь.
Автор, спасибо за уроки. Коллеги, кто столкнулся с проблемой выпадания стандартной формы логина. Вы уже всё проверили. Переписали и скопировали с сайта заново. Очень важно расположение файлов в вашем проекте. Если вы чувствуете, что у вас что-то не так зайдите на гит хаб из видео и перепроверьте расположение.
Спасибо большое. ОЧЕНЬ полезное видео. Настоящий quick start.
Блин, перед тем как сюда зайти смотрел типа, который делал абру кадабру, нифига не понял. Зашёл сюда и всё чётко и ясно показано.
Спасибо большое за ваши умения и опыт!!!!
Как же твой голос мне Тесака напоминает.
Ролики - супер! Благодарю!
Сейчас уже WebSecurityConfigurerAdapter устарел. И вот я не понимаю, каким образом мне сделать вход?
Как решил??
ты решил? у меня после ввода логина и пароля никуда не уходит@@dnepr_10
@@dnepr_10в документации все написано с примерами советую прочитать
@@dnepr_10 SecurityFilterChain
Сударь, вы отлично объясняете. Продолжайте !
Ндааа. Уроки конечно бесценные! Как разбогатею обязательно нажму кнопку Спонсировать.
Спасибо большое за уроки! Очень круто и быстро наращивается проект!
После логина отправляет на стартовую greeting page... Хоть логин и проходит успешно, но хотелось бы чтобы возвращал main page. А логика login как-то заинкапсулирована и не вижу места, где можно перенаправить на Main page.
решил?
В WebSecurityConfig между .formLogin() и .loginPage("/login") добавьте .defaultSuccessUrl("/main")
Отлично объясняешь!
красава Андрей , По больше бы таких проектов !
Хорошие уроки. Спасибо!
Великолепные уроки. Спасибо!!!
большое спасибо автору , очень акуратно с базой данных)
Если получили ошибку
java.sql.SQLFeatureNotSupportedException: Метод org.postgresql.jdbc.PgConnection.createClob() ещё не реализован
Пропишите в application.properties строчку:
spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults=false
Спасибо добрый человек. Земной тебе поклон!
Автор молодец, хоть разобрался во всем =)
Спасибо! Отличный и лаконичный материал!
Приветствую,Андрей.
Если не сложно,можешь объяснить каким образом работает страница логин, где мы описываем логику пошагово именно проверки введенных данных пользователем и сравниваем их с данными в БД.
Пример: Пользователь ввел три раза не правильно пароль от логина, то как и где мы можем описать и отследить в коде всю логику?
Заранее благодарен.
все круто, отлично вспоминаются основы
Отличный канал! Отличные видео! Гениальный преподаватель!
Крутой урок, очень сильно напоминает на JavaFX только без Scene Builder! Пишешь код, а в Postgres происходит магия...
Странная ситуация. Сейчас куски кода в спринг гайде отличаются от видео. И они нифига не работают. Если заменять их на куски из видео, то норм. Но это же не дело, почему так происходит
Например, WebSecurityConfig отличается кардинально. В видео он наследуется от WebSecurityConfigurerAdapter и переопределяет методы, а в текущем гайде ничего не наследует и выглядит совсем по-другому.
в новой версии спринга как я понял немного перелопатили это
Грандиозно.
Правда, очень здорово, что вы взялись осветить эту тухлую тему.
Поясните, зачем все же вы инициализировали коллекцию ролей вновь заведенного пользователя через Collections.singleton()
2-ой вопрос: в метод addUser() вы взяли и добавили Map.
- А мог бы этот метод остаться без этого параметра?
- А где эта карта инициализируется?
- А какие типы данных для ключа-значения допустимы - чем-то это регулируется?
Заранее спасибо
Синглтон создаёт ооочень простую имплементацию коллекции в 1 элемент
Инициализируется спрингом, можно и без этого, но нам же нужен интерактив?
Любые значения от пользователя в примитивных типах
почему у меня в каждом уроке какие то проблемы( жесть, всё также делаю и какая нибудь фигня. В конце вообще приложение не запускается что то пишет с application
Безусловно, очень и очень замечательные уроки. Спасибо! Как побороть это кол-во магии в коде? Пока смотришь, почти всё понятно, но когда пытаешься сам сделать, то становится понятно, что ничего не понял)) Подскажите, стоит на этапе обучения тратить время на jax-rs и jsp или уже совсем старьё? Мне оно как-то более понятным показалось.
1) смириться и писать больше кода
2) jsp морально устарел, не стоит тратить время
Спасибо, Андрей!
Доброе времечко :)
Хороший курс. Но возник вопрос. Получается при таком описани таблиц в базе данных получается индексы таблиц идут в сторону увеличения и значение id (ключа) всегда увеличивается для всех таблиц, и как следствите ключ таблицы не всегда следующее значение. Можно ли это как-то исправить? Спасибо.
change strategy for @GeneratedValue to strategy=GenerationType.IDENTITY
Отличный материал! Огромное спасибо.
Спасибо автору. очень познавательно. Обучаю на этом канале.
Автору как говорит Павел Воля: *Respect и Уважуха*
Всем добрый день. Андрей, спасибо за уроки.
Пересмотрел урок уже несколько раз (и несколько последующих) и не могу понять магии переброса со страницы login на страницу main. Ведь у нас в login.mustache в форме - action="/login" (т.е. переадресация обратно на страницу логина). Или я что-то не так понимаю.
И еще. Хотел добавить на странице main приветствие (аля "Привет, u", где u - имя пользователя в БД). Как строить запрос к базе, чтобы выдернуть текущего пользователя?
Сам отвечу на вторую часть своего вопроса. (Про action="/login" все еще актуальна)
Так вот. Чтобы вписать логин текущего пользователя в любом месте страницы, необходимо добавить
${Session.SPRING_SECURITY_CONTEXT.authentication.principal.getUsername()}
(это показано в уроке №8)
Крутые видосы. Огромное спасибо.
Здравствуйте! Огромное спасибо за Ваш труд! Подскажите , в конце видео , если пользователь уже зарегистрирован, у вас отображается main страница, у меня выбрасывает в самое начало на страничку greetings. Это монтаж видео или я где-то пропустила какой-то нюанс?
Можно сравнить код с моим. Как это делать - можно посмотреть в видео на канале
Привет. Спасибо за отличные уроки. Вопрос, типы данных в самой таблице автоматом создаются varchar, а если брать реальные приложения то типы данных мы должны создавать из приложения или уже после в самой БД?
Здравствуйте. До этого всё заработало, но после регистрации пытаюсь войти и тут выбрасывает на страницу авторизации. см. 18:22. Как вам могу скинуть код?
скорее всего как было у меня, сбился путь в acction= " " в форме, должно быть только название пост запроса но не папок где лежат страницы
У меня возникла такая же проблема. У вас получилось её исправить?
@@Михаил-ф1о3у если я правильно понял проблему, то у меня было подобное. Оказалось, что в сущности User поле "username" должно называться именно "username". У меня было "firstName", поэтому пользователь не пог пройти авторизацию.
Просто красавчик, обожаю
Большое спасибо за видео! Очень интересно и познавательно.
Хочу отметить, что уменя при @Autowired dataSource-а возникает ошибка:
"Could not autowire. There is more than one bean of 'DataSource' type.
Beans:
dataSource (DataSourceConfiguration.class) dataSource (DataSourceConfiguration.class)".
После добавления @Qualifier("dataSource") все работает.
Может, кому-то поможет)
Была такая же проблема. Сидел на 2016 idea обновил до 18, помогло.
подскажите пожалуйста, после авторизации меня перебрасывает на / а в видео на /main, не могу понять где поправить это
Отличные уроки! Но зачем так быстро? Зачем вырезать нужные моменты?
Спасибо за уроки. Вы лучший.
Подскажите,
Какой дистр линукса вы используете?
Сейчас Kubuntu. Но в целом очень нравятся все дистрибутивы из семейства debian
Объясните пожалуйста откуда приходит входной параметр User user в методе addUser (класс - RegistrationController)? На странице "registration" форма отправляет только 2 параметра: username и password, откуда берется класс user в качестве входного праметра?
Поддерживаю вопрос! Сам мучаюсь и не понимаю на каком уровне происходит этот маппинг...
Просто великолепно!!!
Здравствуйте, Андрей,
поясните, пожалуйста,
в виде чего вернёт данные запрос, который заполняет authorities (вы поясняете @ 12:50) - JSON?
Вы оперируете таблицами, значит ваш запрос в JPQL? Или я ошибаюсь?
Я, если честно, не понимаю, в чем смысл писать запрос к таблицам, но не на нативном SQL - просто чтобы в данном месте кода не отсылать к внешнему запросу?
Андрей, позвольте отметить, что на мой взгляд, есть две другие и, как мне кажется, более простые и очевидные формы записи:
1. если запрос следующий: select u from User u, т.е. вы оперируете не таблицами, а сущностью,
то Hibernate возьмет на себя извлечение всех данных о пользователе, включая вложенные либо связанные коллекции.
Никакие неочевидные джойны в запросе в этом случае не нужны.
2. если воспользоваться Spring JPA, то, удивительно, но даже этот запрос можно не писать, а воспользоваться описанным здесь
docs.spring.io/spring-data/jpa/docs/1.5.0.RELEASE/reference/html/jpa.repositories.html#jpa.query-methods.query-creation
так называемым Query Creation From Method Name
Не получается, вылазит дефолтная login форма, что делать не ясно.
Такая же проблема
ругается на то что No method or field with name '_csrf' . хотя один в один с нижним подчеркиванием
@@MrMusinRamil В MvcConfig проверьте setViewName чтобы стоял ("login")
@@MrMusinRamil , посмотри что бы в input login и main значение name="_csrf". У меня на этом затык был.
@@АртёмКорякин-э2в все правильно стоит: name="_csrf" видимо проблема в другом
Продолжай, плз
Обязательно. Не могу отказать подписчику)
Добрый день!
Видео очень крутые, хотел спросить у Вас, а курсы платные у Вас есть?
нет
Подскажите пожалуйста, а когда можно будет изучать Spring? На данный момент разбираю многопоточность, а после буду изучать перечисления и автоупаковка, обобщения, лямбда выражения, модули. Занимаюсь по книге Java “Руководство для начинающих”. Достаточно ли будет ее?
спасибо за уроки благодарю (пока не все понимаю ) но автор молодец
Так-с прошел этот ад. Поехали к следующему. Непонял все-таки, почему код с сайта спринга не работает
Все круто, но подскажите от куда RegistrationController взял объект user? Кто и где нам его собрал и передал в метод? Ведь из формы у нас выходят просто поля.=\
Это Spring сопоставил поля объекта User и поля POST запроса "/registration" с формы
Круто, конечно, но непонятно ж совсем.. Надеюсь будут видео с пояснениями.
И ещё: почему ломбок не используешь?
ты крут, парень. сколько опыта у тебя в Springe и в программировании в общем?
В сфере больше 10 лет, со спрингом лет 6 уже, наверное
Не знаю почему, но в моем случае после авторизации идет перенаправление не в /main, а в /greeting. Еще немного непонятно в каком месте происходит обработка запроса авторизации /login, ведь в контроллерах нет явной аннотации с таким маппингом. Спасибо
возращает обратно на ресурс, с которого был переход на /login
Андрей,
не поясните, зачем нужно переопределять #configure(AuthenticationManagerBuilder) и декларировать #usersByUsernameQuery, если поиск пользователя на самом деле осуществляется в UserRepo#findByUsername?
Андрей, респект за уроки! Столкнулся с траблой. Почему-то после авторизации не редиректит на main, а переходит на корень '/'. Стараюсь писать сам, не копирая ваш проект с гита, может где-то накосячил...
Если разлогиниться, а потом залогиниться, то переходит на корень. Если вначале вбить main, он редиректит на login, логинишься и тогда редиректит на main. Что конечно логично.
Ого! Отличное видео! Спасибо. Жаль что подписаться больше одного раза нельзя)))
Классные видео! Спасибо!
Если у кого-то будут записываться null значения в БД, проверяйте названия переменных (даже на РЕГИСТР) в сущностях и названиях полей на формах. Для меня было неприятной неожиданностью исправлять такой баг
и хотел еще задать вопрос. Какими вы источниками пользовались для изучения java и что кроме спринга посоветуете выучить чтобы работодатели остались довольны? Спасибо за внимание)
Источники - интернет и книга Шилдта)) точнее не скажу. Кроме спринта с гибернейтом для старта особо больше ничего не надо. Знание какого-нибудь js фреймворка сильно поможет, конечно, если в вэб идёте, но тоже не мастхэв. Вообще работодателю угождать пытаться не надо, это почти нереально. Нарабатывайте опыт, рассказывайте о нем на собеседовании, нормальный работодатель такие рассказы любит больше, чем тупые вопросы типа "сколько контекстов в может быть в спринг приложении"
Довольно интересно и то что надо
интересно, что поле active у пользователя обязательно, и если его не сетать на тру при регистрации, то аунтифицироваться не выйдет
после аунтификации, добавление сообщений не работает...может ошибся, а может надо посмотреть следующий урок
автор огромное спасибо
Ждём продолжения))
завтра с утра будет :)