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
}
}
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();
}
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();
}
}