From 3cb703f4a0027730ce13505941c8bbdec2029ec8 Mon Sep 17 00:00:00 2001 From: etc404 Date: Thu, 5 Mar 2026 19:28:35 -0700 Subject: [PATCH] Database-sourced authentication functional. --- .../example/demo/config/SecurityConfig.java | 24 ----------------- .../java/com/example/demo/entity/User.java | 26 +++++++++++++++---- .../com/example/demo/repository/UserRepo.java | 4 +++ .../service/CustomUserDetailsService.java | 23 ++++++++++++++++ 4 files changed, 48 insertions(+), 29 deletions(-) create mode 100644 demo/src/main/java/com/example/demo/service/CustomUserDetailsService.java diff --git a/demo/src/main/java/com/example/demo/config/SecurityConfig.java b/demo/src/main/java/com/example/demo/config/SecurityConfig.java index 4df7691..3d17139 100644 --- a/demo/src/main/java/com/example/demo/config/SecurityConfig.java +++ b/demo/src/main/java/com/example/demo/config/SecurityConfig.java @@ -2,37 +2,13 @@ package com.example.demo.config; import org.springframework.context.annotation.Bean; 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.password.PasswordEncoder; -import org.springframework.security.provisioning.InMemoryUserDetailsManager; -import org.springframework.security.web.SecurityFilterChain; @Configuration public class SecurityConfig { - @Bean - public UserDetailsService userDetailsService() { - UserDetails user = User.builder() - .username("admin") - .password("$2a$12$JWvSOzs7OeY/WBBrFXfjBuvJ5nzk9ivP4FYZeVN5fYNC8uT9Vxs7W") - .build(); - return new InMemoryUserDetailsManager(user); - } - @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } - -// @Bean -// public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { -// http.csrf(csrf -> csrf.disable()) -// .authorizeHttpRequests(auth -> auth -// .anyRequest().permitAll() -// ); -// return http.build(); -// } } \ No newline at end of file diff --git a/demo/src/main/java/com/example/demo/entity/User.java b/demo/src/main/java/com/example/demo/entity/User.java index 7d2b671..aef2380 100644 --- a/demo/src/main/java/com/example/demo/entity/User.java +++ b/demo/src/main/java/com/example/demo/entity/User.java @@ -12,13 +12,18 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashSet; import java.util.Set; @Entity @Table(name = "users") -public class User { +public class User implements UserDetails { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -47,6 +52,21 @@ public class User { @JoinColumn(name = "recipeId") }) private Set FavRecipes = new HashSet<>(); + @Override + public Collection getAuthorities() { + return new ArrayList<>(); + } + + @Override + public String getPassword() { + return hashedpassword; + } + + @Override + public String getUsername() { + return username; + } + public User() { } @@ -66,10 +86,6 @@ public class User { this.id = id; } - public String getUsername() { - return username; - } - public void setUsername(String username) { this.username = username; } diff --git a/demo/src/main/java/com/example/demo/repository/UserRepo.java b/demo/src/main/java/com/example/demo/repository/UserRepo.java index 7dc9f3e..b750838 100644 --- a/demo/src/main/java/com/example/demo/repository/UserRepo.java +++ b/demo/src/main/java/com/example/demo/repository/UserRepo.java @@ -4,6 +4,10 @@ import org.springframework.data.jpa.repository.JpaRepository; import com.example.demo.entity.User; +import java.util.Optional; + public interface UserRepo extends JpaRepository { + Optional findByUsername(String username); + } \ No newline at end of file diff --git a/demo/src/main/java/com/example/demo/service/CustomUserDetailsService.java b/demo/src/main/java/com/example/demo/service/CustomUserDetailsService.java new file mode 100644 index 0000000..e527f07 --- /dev/null +++ b/demo/src/main/java/com/example/demo/service/CustomUserDetailsService.java @@ -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")); + } +}