naprawa hasła
Deploy Polska Lokalnie / deploy (push) Successful in 10s

This commit is contained in:
2026-09-04 00:40:22 +02:00
parent 282b5e424f
commit ee83ac43c4
4 changed files with 84 additions and 11 deletions
+18
View File
@@ -9,3 +9,21 @@ SPRING_JPA_HIBERNATE_DDL_AUTO=update
WEB_BIND_ADDRESS=0.0.0.0 WEB_BIND_ADDRESS=0.0.0.0
BACKEND_BIND_ADDRESS=127.0.0.1 BACKEND_BIND_ADDRESS=127.0.0.1
POSTGRES_BIND_ADDRESS=127.0.0.1 POSTGRES_BIND_ADDRESS=127.0.0.1
# --- Konto administratora ---
# Uzywane przy pierwszym starcie do zalozenia konta. Logowanie odbywa sie ADRESEM E-MAIL.
APP_ADMIN_EMAIL=admin@softspm.com
APP_ADMIN_PASSWORD=Admin123!
APP_ADMIN_NAME=Administrator Polska Lokalnie
# Gdy konto administratora juz istnieje, APP_ADMIN_PASSWORD jest ignorowane - inaczej restart
# cofalby haslo zmienione w ustawieniach konta. Ustaw ponizsze na true, zrestartuj backend i
# wroc do false, zeby awaryjnie przywrocic haslo z APP_ADMIN_PASSWORD.
APP_ADMIN_RESET_PASSWORD=false
# --- Sesje ---
# Min. 32 znaki. W produkcji ustaw wlasna wartosc - domyslna zna kazdy, kto widzial repozytorium.
APP_JWT_SECRET=local-dev-secret-change-me-please-32chars-min
# Adres bazowy w linkach z e-maili (aktywacja konta, reset hasla).
APP_PUBLIC_BASE_URL=http://localhost
@@ -1,6 +1,8 @@
package pl.polskalokalnie.config; package pl.polskalokalnie.config;
import java.math.BigDecimal; import java.math.BigDecimal;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner; import org.springframework.boot.CommandLineRunner;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
@@ -26,6 +28,8 @@ import pl.polskalokalnie.user.UserRepository;
@Component @Component
public class DataSeeder implements CommandLineRunner { public class DataSeeder implements CommandLineRunner {
private static final Logger log = LoggerFactory.getLogger(DataSeeder.class);
private final UserRepository userRepository; private final UserRepository userRepository;
private final ListingRepository listingRepository; private final ListingRepository listingRepository;
private final BannerRepository bannerRepository; private final BannerRepository bannerRepository;
@@ -36,6 +40,7 @@ public class DataSeeder implements CommandLineRunner {
private final String adminEmail; private final String adminEmail;
private final String adminPassword; private final String adminPassword;
private final String adminName; private final String adminName;
private final boolean adminResetPassword;
public DataSeeder( public DataSeeder(
UserRepository userRepository, UserRepository userRepository,
@@ -47,7 +52,8 @@ public class DataSeeder implements CommandLineRunner {
NickService nickService, NickService nickService,
@Value("${app.admin.email:admin@softspm.com}") String adminEmail, @Value("${app.admin.email:admin@softspm.com}") String adminEmail,
@Value("${app.admin.password:Admin123!}") String adminPassword, @Value("${app.admin.password:Admin123!}") String adminPassword,
@Value("${app.admin.name:Administrator Polska Lokalnie}") String adminName @Value("${app.admin.name:Administrator Polska Lokalnie}") String adminName,
@Value("${app.admin.reset-password:false}") boolean adminResetPassword
) { ) {
this.userRepository = userRepository; this.userRepository = userRepository;
this.listingRepository = listingRepository; this.listingRepository = listingRepository;
@@ -59,6 +65,7 @@ public class DataSeeder implements CommandLineRunner {
this.adminEmail = adminEmail; this.adminEmail = adminEmail;
this.adminPassword = adminPassword; this.adminPassword = adminPassword;
this.adminName = adminName; this.adminName = adminName;
this.adminResetPassword = adminResetPassword;
} }
@Override @Override
@@ -135,19 +142,45 @@ public class DataSeeder implements CommandLineRunner {
return banner; return banner;
} }
/**
* Konto administratora z konfiguracji (APP_ADMIN_EMAIL / APP_ADMIN_PASSWORD).
*
* Gdy konta o tym adresie jeszcze nie ma - zakladamy je. Gdy juz istnieje, haslo z konfiguracji
* jest ignorowane, bo inaczej kazdy restart cofalby haslo zmienione w ustawieniach konta.
* Swiadome nadpisanie wlacza APP_ADMIN_RESET_PASSWORD=true - to jedyna droga odzyskania dostepu,
* gdy haslo administratora zostalo zgubione.
*/
private void seedAdmin() { private void seedAdmin() {
if (userRepository.existsByEmailIgnoreCase(adminEmail)) { String email = adminEmail.trim().toLowerCase();
return; AppUser existing = userRepository.findByEmailIgnoreCase(email).orElse(null);
}
if (existing == null) {
AppUser admin = new AppUser(); AppUser admin = new AppUser();
admin.setEmail(adminEmail.toLowerCase()); admin.setEmail(email);
admin.setFullName(adminName); admin.setFullName(adminName);
admin.setNick(nickService.generateUnique(adminEmail.split("@")[0])); admin.setNick(nickService.generateUnique(email.split("@")[0]));
admin.setPasswordHash(passwordEncoder.encode(adminPassword)); admin.setPasswordHash(passwordEncoder.encode(adminPassword));
admin.setRole(Role.ADMIN); admin.setRole(Role.ADMIN);
admin.setProvider(AuthProvider.LOCAL); admin.setProvider(AuthProvider.LOCAL);
admin.setVerified(true); admin.setVerified(true);
userRepository.save(admin); userRepository.save(admin);
log.info("Utworzono konto administratora {}", email);
return;
}
if (!adminResetPassword) {
return;
}
// Awaryjne przywrocenie dostepu: haslo, rola i aktywacja wracaja do stanu z konfiguracji.
// Blokada konta tez znika - inaczej reset hasla nie przywrocilby logowania.
existing.setPasswordHash(passwordEncoder.encode(adminPassword));
existing.setRole(Role.ADMIN);
existing.setVerified(true);
existing.setBlocked(false);
userRepository.save(existing);
log.warn("APP_ADMIN_RESET_PASSWORD=true - ustawiono haslo z konfiguracji dla konta {}."
+ " Wylacz te zmienna po odzyskaniu dostepu.", email);
} }
private void seedDemoListings() { private void seedDemoListings() {
+11
View File
@@ -21,6 +21,17 @@ services:
SPRING_DATASOURCE_USERNAME: ${POSTGRES_USER:-polskalokalnie} SPRING_DATASOURCE_USERNAME: ${POSTGRES_USER:-polskalokalnie}
SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:-polskalokalnie_dev} SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:-polskalokalnie_dev}
SPRING_JPA_HIBERNATE_DDL_AUTO: ${SPRING_JPA_HIBERNATE_DDL_AUTO:-update} SPRING_JPA_HIBERNATE_DDL_AUTO: ${SPRING_JPA_HIBERNATE_DDL_AUTO:-update}
# Bez tych zmiennych backend bierze wartosci domyslne z application.yml, wiec login i haslo
# administratora ustawione w .env nie mialy zadnego wplywu na dzialajaca aplikacje.
APP_ADMIN_EMAIL: ${APP_ADMIN_EMAIL:-admin@softspm.com}
APP_ADMIN_PASSWORD: ${APP_ADMIN_PASSWORD:-Admin123!}
APP_ADMIN_NAME: ${APP_ADMIN_NAME:-Administrator Polska Lokalnie}
# true = przy starcie ustaw haslo administratora na APP_ADMIN_PASSWORD (odzyskanie dostepu).
APP_ADMIN_RESET_PASSWORD: ${APP_ADMIN_RESET_PASSWORD:-false}
# Sekret podpisujacy tokeny sesji. Domyslna wartosc jest jawna w repozytorium - w produkcji
# musi byc wlasna, inaczej kazdy moze wystawic sobie token administratora.
APP_JWT_SECRET: ${APP_JWT_SECRET:-local-dev-secret-change-me-please-32chars-min}
APP_PUBLIC_BASE_URL: ${APP_PUBLIC_BASE_URL:-http://localhost}
depends_on: depends_on:
db: db:
condition: service_healthy condition: service_healthy
+11
View File
@@ -23,6 +23,17 @@ services:
SPRING_DATASOURCE_USERNAME: ${POSTGRES_USER:-polskalokalnie} SPRING_DATASOURCE_USERNAME: ${POSTGRES_USER:-polskalokalnie}
SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:-polskalokalnie_dev} SPRING_DATASOURCE_PASSWORD: ${POSTGRES_PASSWORD:-polskalokalnie_dev}
SPRING_JPA_HIBERNATE_DDL_AUTO: ${SPRING_JPA_HIBERNATE_DDL_AUTO:-update} SPRING_JPA_HIBERNATE_DDL_AUTO: ${SPRING_JPA_HIBERNATE_DDL_AUTO:-update}
# Bez tych zmiennych backend bierze wartosci domyslne z application.yml, wiec login i haslo
# administratora ustawione w .env nie mialy zadnego wplywu na dzialajaca aplikacje.
APP_ADMIN_EMAIL: ${APP_ADMIN_EMAIL:-admin@softspm.com}
APP_ADMIN_PASSWORD: ${APP_ADMIN_PASSWORD:-Admin123!}
APP_ADMIN_NAME: ${APP_ADMIN_NAME:-Administrator Polska Lokalnie}
# true = przy starcie ustaw haslo administratora na APP_ADMIN_PASSWORD (odzyskanie dostepu).
APP_ADMIN_RESET_PASSWORD: ${APP_ADMIN_RESET_PASSWORD:-false}
# Sekret podpisujacy tokeny sesji. Domyslna wartosc jest jawna w repozytorium - w produkcji
# musi byc wlasna, inaczej kazdy moze wystawic sobie token administratora.
APP_JWT_SECRET: ${APP_JWT_SECRET:-local-dev-secret-change-me-please-32chars-min}
APP_PUBLIC_BASE_URL: ${APP_PUBLIC_BASE_URL:-http://localhost}
depends_on: depends_on:
db: db:
condition: service_healthy condition: service_healthy