Database-sourced authentication functional.

This commit is contained in:
etc404
2026-03-05 19:28:35 -07:00
committed by Autumn Wolf
parent be449f621f
commit 3cb703f4a0
4 changed files with 48 additions and 29 deletions
@@ -2,37 +2,13 @@ package com.example.demo.config;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
@Configuration @Configuration
public class SecurityConfig { public class SecurityConfig {
@Bean
public UserDetailsService userDetailsService() {
UserDetails user = User.builder()
.username("admin")
.password("$2a$12$JWvSOzs7OeY/WBBrFXfjBuvJ5nzk9ivP4FYZeVN5fYNC8uT9Vxs7W")
.build();
return new InMemoryUserDetailsManager(user);
}
@Bean @Bean
public PasswordEncoder passwordEncoder() { public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); return new BCryptPasswordEncoder();
} }
// @Bean
// public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// http.csrf(csrf -> csrf.disable())
// .authorizeHttpRequests(auth -> auth
// .anyRequest().permitAll()
// );
// return http.build();
// }
} }
@@ -12,13 +12,18 @@ import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType; import jakarta.persistence.GenerationType;
import jakarta.persistence.CascadeType; import jakarta.persistence.CascadeType;
import jakarta.persistence.Column; import jakarta.persistence.Column;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
@Entity @Entity
@Table(name = "users") @Table(name = "users")
public class User { public class User implements UserDetails {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -47,6 +52,21 @@ public class User {
@JoinColumn(name = "recipeId") }) @JoinColumn(name = "recipeId") })
private Set<Recipe> FavRecipes = new HashSet<>(); private Set<Recipe> FavRecipes = new HashSet<>();
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return new ArrayList<>();
}
@Override
public String getPassword() {
return hashedpassword;
}
@Override
public String getUsername() {
return username;
}
public User() { public User() {
} }
@@ -66,10 +86,6 @@ public class User {
this.id = id; this.id = id;
} }
public String getUsername() {
return username;
}
public void setUsername(String username) { public void setUsername(String username) {
this.username = username; this.username = username;
} }
@@ -4,6 +4,10 @@ import org.springframework.data.jpa.repository.JpaRepository;
import com.example.demo.entity.User; import com.example.demo.entity.User;
import java.util.Optional;
public interface UserRepo extends JpaRepository<User, Integer> { public interface UserRepo extends JpaRepository<User, Integer> {
Optional<User> findByUsername(String username);
} }
@@ -0,0 +1,23 @@
package com.example.demo.service;
import com.example.demo.repository.UserRepo;
import org.jspecify.annotations.NonNull;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class CustomUserDetailsService implements UserDetailsService {
private final UserRepo userRepo;
public CustomUserDetailsService(UserRepo userRepo) {
this.userRepo = userRepo;
}
@Override
public UserDetails loadUserByUsername(@NonNull String username) throws UsernameNotFoundException {
return userRepo.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found"));
}
}