Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 762812649c | |||
| 6fd8f8ecc8 |
@@ -39,18 +39,37 @@ public class AdminUserController {
|
||||
|
||||
@PostMapping("/users/save")
|
||||
public String saveUser(@ModelAttribute("user") User user) {
|
||||
if (user.getId() != null && (user.getPassword() == null || user.getPassword().isBlank())) {
|
||||
if (user.getId() != null) {
|
||||
User existingUser = userService.findById(user.getId())
|
||||
.orElseThrow(() -> new IllegalArgumentException("Ungültige User-ID: " + user.getId()));
|
||||
// Passwort: leer = unverändert übernehmen, sonst neu verschlüsseln (Admin-Reset)
|
||||
if (user.getPassword() == null || user.getPassword().isBlank()) {
|
||||
user.setPassword(existingUser.getPassword());
|
||||
} else {
|
||||
user.setPassword(passwordEncoder.encode(user.getPassword()));
|
||||
}
|
||||
// Profilbild steht nicht im Formular -> bestehendes erhalten, nicht überschreiben
|
||||
user.setProfilePicture(existingUser.getProfilePicture());
|
||||
} else {
|
||||
user.setPassword(passwordEncoder.encode(user.getPassword()));
|
||||
}
|
||||
|
||||
userService.save(user);
|
||||
return "redirect:/admin/users";
|
||||
}
|
||||
|
||||
/** Direktes Zurücksetzen des Passworts eines Nutzers (Admin-Recovery, ohne E-Mail). */
|
||||
@PostMapping("/users/{id}/reset-password")
|
||||
public String resetPassword(@PathVariable Long id, @RequestParam String newPassword) {
|
||||
if (newPassword != null && !newPassword.isBlank()) {
|
||||
User user = userService.findById(id)
|
||||
.orElseThrow(() -> new IllegalArgumentException("Ungültige User-ID: " + id));
|
||||
user.setPassword(passwordEncoder.encode(newPassword.trim()));
|
||||
userService.save(user);
|
||||
}
|
||||
return "redirect:/admin/users";
|
||||
}
|
||||
|
||||
@GetMapping("/users/edit/{id}")
|
||||
public String editUserForm(@PathVariable Long id, Model model) {
|
||||
User user = userService.findById(id).orElseThrow(() -> new IllegalArgumentException("Ungültige User-ID: " + id));
|
||||
|
||||
@@ -34,8 +34,9 @@
|
||||
</div>
|
||||
|
||||
<div class="mf-field">
|
||||
<label class="mf-label">Passwort</label>
|
||||
<input class="mf-input" type="password" name="password" th:required="${user.id == null}" autocomplete="new-password"/>
|
||||
<label class="mf-label" th:text="${user.id == null} ? 'Passwort' : 'Neues Passwort (leer lassen = unverändert)'">Passwort</label>
|
||||
<input class="mf-input" type="password" name="password" th:required="${user.id == null}" autocomplete="new-password"
|
||||
th:placeholder="${user.id == null} ? 'Passwort' : 'leer lassen = unverändert'"/>
|
||||
</div>
|
||||
|
||||
<div class="mf-field">
|
||||
|
||||
@@ -43,9 +43,17 @@
|
||||
<td th:text="${user.id}">1</td>
|
||||
<td th:text="${user.username}">Max</td>
|
||||
<td th:text="${user.email}">max@mindflux.de</td>
|
||||
<td style="display:flex; gap:.5rem; flex-wrap:wrap;">
|
||||
<td style="display:flex; gap:.5rem; flex-wrap:wrap; align-items:center;">
|
||||
<a th:href="@{'/admin/users/edit/' + ${user.id}}" class="mf-btn outline">Bearbeiten</a>
|
||||
<form th:action="@{'/admin/users/delete/' + ${user.id}}" method="post" style="display:inline;">
|
||||
<form th:action="@{'/admin/users/' + ${user.id} + '/reset-password'}" method="post"
|
||||
style="display:flex; gap:.35rem; align-items:center;"
|
||||
onsubmit="return confirm('Passwort für diesen Nutzer wirklich neu setzen?');">
|
||||
<input class="mf-input" type="text" name="newPassword" placeholder="Neues Passwort"
|
||||
required minlength="4" style="width:150px; padding:.45rem .6rem;">
|
||||
<button type="submit" class="mf-btn">PW zurücksetzen</button>
|
||||
</form>
|
||||
<form th:action="@{'/admin/users/delete/' + ${user.id}}" method="post" style="display:inline;"
|
||||
onsubmit="return confirm('Benutzer wirklich löschen?');">
|
||||
<button type="submit" class="mf-btn danger">Löschen</button>
|
||||
</form>
|
||||
</td>
|
||||
|
||||
Reference in New Issue
Block a user