luchob / softuni-music-db

Our workshop project for the course Spring Advanced 2021
3 stars 11 forks source link

Проблем с login и logout #3

Closed Stefan-Markov closed 3 years ago

Stefan-Markov commented 3 years ago

Здравейте, благодаря за насоките за проблема при css. Прегледах последното видео и опитвам да направя login и logout. Имам успех с валидациите при регистрация и всичко е добре до тук. После някак никакъв резултат и не може да се логна. Ако не закоментирам " SecurityContextHolder.getContext().setAuthentication(authentication);" всичко гърми, но пък се логва user-а. Иначе нямам нито съобщения за грешка, нито се логва. Нещо много сериозно съм оплескал.

Това е проекта: https://github.com/StefanFMarkov/projectdefence

luchob commented 3 years ago

Здравей!

Насоките за създаване на линкове с thymeleaf, важат също и за логин формата. Първата очевидна грешка е ето тук:

    <form th:object="${userLoginBindingModel}" action="/user/login" method="POST">

Трябва да е:

    <form th:object="${userLoginBindingModel}" th:action="@{/user/login}" method="POST">

Ако си спомняш, когато говорихме за CSRF споменах, че това нещо инсъртва един "CSRF" токън, без който защитата срещу CSRF сработва и няма да те пусне да се логнеш.

След това забелещи как създаваш принципала:

       return new org.springframework.security.core.userdetails.User(
                user.getEmail(),
                user.getPassword() != null ? user.getPassword() : "",
                authorities);

Тук слагаш имейл вместо username :-) Затова споменах, че ако аз го правя това ще махна username и ще оставя само email. И без това логин с Facebook, например става по лесно така.

Тези също не ти трябват:

    @PreAuthorize("isAnonymous()")

Давай така и да видим дали ще успееш да се логнеш :-)

Поздрави, Л.

Stefan-Markov commented 3 years ago

Здравейте, да сега мога да се логна или да направя logout. Но нямам никакви грешки ако имам грешни credentials или послетата са ми празни. Докато конзолата се пръска от грешки, но програмата не спира.

luchob commented 3 years ago

Привет!

Този път ексепшъна е следния:

Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "username" (template: "/login" - line 35, col 51)

Това иде оттук, в login template:

<input th:field="*{username}" th:value="*{username}" class="input-style" name="username" type="text"
       id="inputUsername"
       placeholder="Enter username">

Което пък иде оттук:

<form th:object="${userLoginBindingModel}"

Проблемът е, че ти нямаш binding model при логин. Къде работиш с него? :-) При логин ендпойнта е на spring security и там просто няма байндинг модели, а имплементирането на къстъм валидации не е никак проста задача. Добрата новина е, че в повечето случаи просто не е и нужно.

За твоя проект ми се струва удачно:

  1. Да разкараш байндинг модела от login темплейта
  2. Да слагаш една единствена грешка, а именно user name and password combination not found
  3. Тази грешка да се сетва в модела в @PostMapping("/login-error") както правиш сега.
  4. Никога не се попълва полето за паролата при грешка, то трябва да е празно
  5. Попълва се username полето в @PostMapping("/login-error")

Виж в музикалния workshop за пример.

Поздрави, Л.

Stefan-Markov commented 3 years ago

Добро утро. Правя странни асоциации с практики от предходния модул и ме бъркат явно.Логина работи сега без проблем. Може ли насока сега как да си взема инфромацията като име на логнатия user. Преди го правехме в current user и post mapping и там си сетвам. Сега не се ориентирам от къде да си взема името на логнатия user и да го сложа в home page за поздрав.

luchob commented 3 years ago

Добро да е, то вече е ден :-) Може, да. Има два нормални начина.

Или инжектираш authentication principal (пример) или използваш интеграцията на thymeleaf със spring security - 4-та точка тук.

Поздрави!