Как редактирование роли пользователя в Spring Security меняет пароль / доступ пользователя? - PullRequest
0 голосов
/ 19 апреля 2020

Когда я редактирую роли пользователя через страницу в моем приложении, это каким-то образом изменяет пароль пользователя. Я не могу на всю жизнь понять, где я меняю пароль пользователя в своем коде. Я даже дошел до того, что распечатал хешированный пароль после того, как позвонил в службу поддержки пользователей, и они все еще совпадают! Но когда я выхожу и пытаюсь войти в систему с теми же учетными данными пользователя, Spring говорит, что учетные данные недействительны. Как ни странно, это происходит только тогда, когда я меняю роли, если я меняю только имя или адрес электронной почты, которых проблема не представляет.

Это мой метод сохранения в userServiceImpl

@Override
    public void save(User user) {
        System.out.println("User trying to save");
        user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
        userRepository.save(user);
    }

И это контроллер для редактирования (я знаю, что это беспорядок, и его нужно почистить ОЧЕНЬ МНОГО!)

@PostMapping("/users/edit")
    public String editUser(@ModelAttribute("userForm") User user, BindingResult bindingResult, Model model) {
        model.addAttribute("highestRole", getHighestRole(user.getUserName(), userService));
        model.addAttribute("pageTitle", "AIM - Edit User Id:" + user.getId());
        model.addAllAttributes(getUserAttributes());
        model.addAttribute("roles", roleRepository.findAll());
        userValidator.validate(user, bindingResult);

        if (bindingResult.hasErrors()) {
            return "user_edit";
        }

        User userFromDB = userService.findById(user.getId());
        if (!user.getFirstName().equals(userFromDB.getFirstName())) {
            userFromDB.setFirstName(user.getFirstName());
        }
        if (!user.getLastName().equals(userFromDB.getLastName())) {
            userFromDB.setLastName(user.getLastName());
        }
        if (!user.getEmail().equals(userFromDB.getEmail())) {
            userFromDB.setEmail(user.getEmail());
        }
        System.out.println("form password length: " + user.getPassword().length());
        if (user.getPassword().length() != 0 && !bCryptPasswordEncoder.matches(user.getPassword(), userFromDB.getPassword())) {
            userFromDB.setPassword(user.getPassword());
            System.out.println("Changed password");
        }
        String currentHighestRole = getHighestRole(userFromDB.getUserName(), userService);
        String newHighestRole = getHighestRoleFromUser(user);
        System.out.println("Role set for current user = " + userFromDB.getRoles().toString());
        System.out.println("Role set for new user = " + user.getRoles().toString());
        if (!currentHighestRole.equals(newHighestRole)) {
            // Ensure that at least one Super User remains
            if (currentHighestRole == "SUPER_USER") {
                List<User> userList = userService.getAllUsers();
                int countOfSuperUsers = 0;
                for (User u : userList) {
                    if (getHighestRoleFromUser(u).equals("SUPER_USER")) countOfSuperUsers++;
                }
                if (countOfSuperUsers <= 1)
                    return "redirect:/users/viewAll?alert=error&message=Cannot reduce Super User's role. At a minimum, there must be at least one Super User within the application.";
            }
            // Create new set of roles for user
            Set<Role> newRoleSet = new HashSet<>();
            for (Role role : roleRepository.findAll()) {
                if (newHighestRole.equals(role.getName())) {
                    newRoleSet.add(role);
                    System.out.println("Setting highest role to: " + role.getName());
                    break;
                }
            }
            System.out.println("New role set looks like this: " + newRoleSet.toString());
            userFromDB.setRoles(newRoleSet);
        }
        userService.save(userFromDB);
        System.out.println("Highest role attribute on page = " + getHighestRole(user.getUserName(), userService));


        User newUser = userService.findByUsername(userFromDB.getUserName());
        System.out.println("Password After Save:" + newUser.getPassword());
        return "redirect:/users/view?id=" + user.getId();
    }

Я должен также добавить, что мое намерение заключается в том, чтобы SUPER_USER мог редактировать что-либо о пользователя, включая пароль, но если поля пароля оставить пустыми, пароль останется неизменным.

...