Spring Boot: Konflikt mit der Methode „loadUserByUsername“ – Hilfe bei der Lösung des Problems erforderlichJava

Java-Forum
Guest
 Spring Boot: Konflikt mit der Methode „loadUserByUsername“ – Hilfe bei der Lösung des Problems erforderlich

Post by Guest »

Ich implementieren die UserDetailsService-Schnittstelle in meiner Spring Boot-Anwendung, um eine benutzerdefinierte Methode „loadUserByUsername“ für die Authentifizierung zu verwenden. Bei meiner aktuellen Implementierung treten jedoch Probleme auf, da die Methode nicht wie erwartet zu funktionieren scheint.
Ich verwende zwei separate Dienste: CustomUserDetailsService und UserService. Meine Anforderung besteht darin, zwei POST-Endpunkte zu haben: /login-admin und /login-user. Wenn ich eine POST-Anfrage an /login-admin stelle, möchte ich, dass die Authentifizierung den CustomUserDetailsService verwendet. Wenn ich eine POST-Anfrage an /login-user stelle, möchte ich ebenfalls, dass die Authentifizierung den UserService verwendet.
Derzeit unterscheidet meine Implementierung aufgrund der Methode „loadUserByUsername“ nicht korrekt zwischen diesen beiden Diensten ist widersprüchlich.
hier ist der Controller;

Code: Select all

@Controller
public class MainController {
@Autowired
@Qualifier("customUserDetailsService")
private CustomUserDetailsService adminService;

@Autowired
@Qualifier("userService")
private UserService userService;

@PostMapping("/login-admin")
public String loginAdmin(@RequestParam("username") String username,
@RequestParam("password") String password,
Model model) {
Admin admin = (Admin) adminService.loadUserByUsername(username);

if (admin == null || !passwordEncoder.matches(password, admin.getPassword())) {
model.addAttribute("error", "username or password is wrong.");
return "login-admin"; // Incorrect login
}

// Successful login
return "redirect:/admin-dashboard";
}

@PostMapping("/login-user")
public String loginUser(@RequestParam("email") String email,
@RequestParam("password") String password,
Model model) {
User user = (User) userService.loadUserByUsername(email);

if (user == null || !passwordEncoder.matches(password, user.getPassword())) {
model.addAttribute("error", "email or passwrod is wrong.");
return "login-user";
}

// Successful login
return "redirect:/user-dashboard"; // Redirect to user dashboard
}

}

hier ist der CustomUserDetailsService;

Code: Select all

@Service("customUserDetailsService")
public class CustomUserDetailsService implements UserDetailsService {

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Admin admin = adminRepository.findByUsername(username);

if (admin == null) {
throw new UsernameNotFoundException(username);
} else {
System.out.println(admin.getUsername());
}

return org.springframework.security.core.userdetails.User.builder()
.username(admin.getUsername())
.password(admin.getPassword())
.roles(admin.getRole())
.build();

}

hier ist der UserService;

Code: Select all

@Service("userService")
public class UserService implements UserDetailsService {

@Autowired
private UserRepository userRepository;

@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
User user = userRepository.findByEmail(email);

if (user == null) {
throw new UsernameNotFoundException("User not found with email: " + email);
}

return org.springframework.security.core.userdetails.User.builder()
.username(user.getEmail())
.password(user.getPassword())
.roles(user.getRole())
.build();
}
}

Ich habe versucht, die @Qualifier-Methode zu verwenden, aber es hat nicht funktioniert. Ich möchte „CustomUserDetailsService“ ordnungsgemäß mit „/login-admin“ und „UserService“ mit „/login-user“ verbinden, ohne dass es zu Konflikten in der Methode „loadUserByUsername“ kommt.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post