Spring Boot:loadUserByUsername 方法冲突 - 需要帮助解决问题

问题描述 投票:0回答:1

我正在 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 方法中没有任何冲突。

java spring spring-boot spring-mvc model-view-controller
1个回答
0
投票

loadUserByUsername
方法返回
UserDetails
类型。您不能将其投射到您自己的
Admin
User
类。

您的实现正在返回

org.springframework.security.core.userdetails.User
,这是
UserDetails
的实现。您可能会对上面 spring 的
User
类和您自己的
User
Admin
类感到困惑。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.