我正在 Spring Boot 应用程序中实现 UserDetailsService 接口,以使用自定义 loadUserByUsername 方法进行身份验证。但是,我当前的实现遇到了问题,因为该方法似乎没有按预期工作。
我正在使用两个单独的服务:CustomUserDetailsService 和 UserService。我的要求是有两个 POST 端点:/login-admin 和 /login-user。当我向 /login-admin 发出 POST 请求时,我希望身份验证使用 CustomUserDetailsService。同样,当我向 /login-user 发出 POST 请求时,我希望身份验证使用 UserService。
目前,我的实现无法正确区分这两个服务,因为 loadUserByUsername 方法存在冲突。
这是控制器;
@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
}
}
这里是CustomUserDetailsService;
@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();
}
这里是UserService;
@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();
}
}
我尝试使用@Qualifier方法,但没有成功。我想正确连接“CustomUserDetailsService”与“/login-admin”和“UserService”与“/login-user”,而在 loadUserByUsername 方法中没有任何冲突。
loadUserByUsername
方法返回 UserDetails
类型。您不能将其投射到您自己的 Admin
或 User
类。
您的实现正在返回
org.springframework.security.core.userdetails.User
,这是 UserDetails
的实现。您可能会对上面 spring 的 User
类和您自己的 User
和 Admin
类感到困惑。