java 无法更新Springboot中的用户角色

fnx2tebb  于 2023-02-28  发布在  Java
关注(0)|答案(1)|浏览(119)

每当我尝试更新用户角色时,它都会自动更新密码。
这是service类:

@Service
public class UserService {

    @Autowired(required=true)
    private UserRepository userRepo;
    
    @Autowired RoleRepository roleRepo;
    
    @Autowired PasswordEncoder passwordEncoder;
    
    public void registerDefaultUser(User user) {
        Role roleUser = roleRepo.findByName("User");
        user.addRole(roleUser);
        encodePassword(user);
        userRepo.save(user);
    }
    
    public List<User> listAll() {
        return userRepo.findAll();
    }

    public User get(Long id) {
        return userRepo.findById(id).get();
    }
    
    public List<Role> listRoles() {
        return roleRepo.findAll();
    }
    
    public void save(User user) {
        encodePassword(user);       
        userRepo.save(user);
    }

}

这是controller

@GetMapping("/users/edit/{id}")
public String editUser(@PathVariable("id") Long id, Model model) {
    User user = service.get(id);
    List<Role> listRoles = service.listRoles();
    model.addAttribute("user", user);
    model.addAttribute("listRoles", listRoles);
    return "user_form";
}

@PostMapping("/users/save")
public String saveUser(User user) {
    user.getPassword(); 
    service.save(user);
    
    return "redirect:/users";
}

我想只更新角色,而不更改用户设置的密码。

icnyk63a

icnyk63a1#

在保存为您的安全函数上的密码更改总是调用encodePassword(user);。您可以通过多种方式防止这种情况。
1.给予用户的编辑函数一个独立于创建的端点,并在服务中创建一个更新函数,该函数不调用encodePassword(user)函数。
1.不要在post中使用模型实体,不要引入一个保存用户所有可修改字段的bean,然后在保存函数中检查是否给出了新密码,然后只更改用户密码。

public void save(UserBean userBean)
{
    User user;
    if(userBean.getId() == null)
        user = new User();
    else
        user = userRepo.findById(userBean.getId()).orElseThrow(() -> new IllegalStateException("no user with id"));

    if(userBean.getPassword() != null)
    {
        user.setPassword(userBean.getPassword());
        encodePassword(user);
    }

    user.setName(userBean.getName());
    // rest of you fields to edit/set
    userRepo.save(user);
}

相关问题