Информация о пользователе удаляется при перезагрузке приложения
При запуске приложения и регистрации пользователя все работает нормально, однако если приложение перезагрузить то пользователь уже не может залогиниться, потому что 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
Однако эту фичу надо использовать осторожно, т.к. лучше вручную все изменения схемы прописывать - автогенерация может сделать не то, что вы имели в виду.