Информация о пользователе удаляется при перезагрузке приложения

При запуске приложения и регистрации пользователя все работает нормально, однако если приложение перезагрузить то пользователь уже не может залогиниться, потому что UserDetails = null.

RegController.java


@Controller
public class RegController {
    @Autowired
    private UserRepo userRepo;

    @PostMapping(path="/add") // Map ONLY POST Requests
    public String addNewUser (User user) {

        User userFromDb = userRepo.findByUsername(user.getUsername());
        if (userFromDb != null) {
            return "User already exists";
        }
        user.setActive(true);
        user.setRolesSet(Collections.singleton(Roles.USER));
        userRepo.save(user);
        return "redirect:/login";
    }

    @GetMapping(path = "/add")
    public  String register(){
        return "registration";
    }

}

User.java

@Entity
@Table(name="usr", schema="public")
public class User  implements UserDetails {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id", updatable = false, nullable = false, unique=true)
    private Long id;

    @Column(nullable = false, unique = true)
    private String username;
    @Column
    private String password;
    @Column(nullable = false, unique = true)
    private String email;
    @Column
    private boolean active;
    @ElementCollection(targetClass = Roles.class, fetch = FetchType.EAGER)
    @CollectionTable(name="user_role", joinColumns = @JoinColumn(name = "user_id"))
    @Enumerated(EnumType.STRING)
    private Set<Roles> rolesSet;

    public User(){}

    public User(String username, String password){
        this.username = username;
        this.password = password;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return isActive();
    }

    public void setUsername(String username) {
        this.username = username;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return getRolesSet();
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public boolean isActive() {
        return active;
    }

    public void setActive(boolean active) {
        this.active = active;
    }

    public Set<Roles> getRolesSet() {
        return rolesSet;
    }

    public void setRolesSet(Set<Roles> rolesSet) {
        this.rolesSet = rolesSet;
    }
}

WebSecurityConfig.java

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserService userService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/", "/add").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
                .logout()
                .permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService)
                .passwordEncoder(NoOpPasswordEncoder.getInstance());


    }
}

build.gradle

plugins {
    id 'org.springframework.boot' version '2.4.3'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.rotor'
version = '0.0.1-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.postgresql:postgresql'
    implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
    implementation 'org.springframework.boot:spring-boot-starter-security'
    implementation 'org.springframework.security:spring-security-test'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

test {
    useJUnitPlatform()
}

application.properties

spring.datasource.url=jdbc:postgresql://localhost/rotor
spring.datasource.username=postgres
spring.datasource.password=*******
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create


Ответы (1 шт):

Автор решения: ЮрийСПб

Вы явно указали пересоздавать БД при старте:

spring.jpa.hibernate.ddl-auto=create

А вот так можно указать обновлять схему БД, а не создавать с нуля.

spring.jpa.hibernate.ddl-auto=update


Однако эту фичу надо использовать осторожно, т.к. лучше вручную все изменения схемы прописывать - автогенерация может сделать не то, что вы имели в виду.

→ Ссылка