繁体   English   中英

使用 spring 引导更新数据库中的数据

[英]Update data in database using spring boot

我正在尝试更改当前登录用户的密码。 任何想法,为什么要添加具有相同列的另一行,除了已更改的密码? 可能是我使用了错误的方法?

有我的 controller MainController.java

@RestController
public class MainController {
    @Autowired
    private AuthenticationManager authenticationManager;

    @Autowired
    private MyUserDetailsService myUserDetailsService;

    @Autowired
    private JwtUtil jwtTokenUtil;

    // Change the password
    @RequestMapping(value = "/settings", method = RequestMethod.PUT)
    public String updatePassword(@AuthenticationPrincipal MyUserDetails myUserDetails,
                                       @RequestBody UserCredentialsPojo pojo,
                                       Users users) {
        return myUserDetailsService.changePassword(users, myUserDetails,
                                                    pojo.getNewPassword(), pojo.getNewPassword1(), pojo.getOldPassword());
    }

    // Authentication with jwt token
    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public ResponseEntity<?> createAuthenticationToken(@RequestBody AuthenticationRequest authenticationRequest) throws Exception {
        try {
            authenticationManager.authenticate(
                    new UsernamePasswordAuthenticationToken(authenticationRequest.getUsername(), authenticationRequest.getPassword())
            );
        } catch (BadCredentialsException e) {
            throw new Exception("Incorrect username and password", e);
        }

        final UserDetails userDetails = myUserDetailsService
                .loadUserByUsername(authenticationRequest.getUsername());

        final String jwt = jwtTokenUtil.generateToken(userDetails);

        return ResponseEntity.ok(new AuthenticationResponse(jwt));
    }
}

UsersEntity.java

@Entity
@Table(name = "users")
public class Users {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @Column(name = "username", length = 255)
    private String username;

    @Column(name = "firstname", length = 255)
    private String firstname;

    @Column(name = "lastname", length = 255)
    private String lastname;

    @Column(name = "password", length = 255)
    private String password;

    @Column(name = "roles", length = 255)
    private String roles;

    @Column(name = "email", length = 255)
    private String email;

    @Column(name = "lastLoginDate", length = 255)
    private String lastLoginDate;

    @Column(name = "registrationDate", length = 255)
    private String registrationDate;

    @Column(name = "lastLoginIp", length = 255)
    private String lastLoginIp;

    @Column(name = "balance")
    private Integer balance;

    @Column(name = "status")
    private Integer status;

    @Column(name = "birthDate", length = 255)
    private String birthDate;

    @Column(name = "departmentId")
    private Integer departmentId;

    @Column(name = "facultyId")
    private Integer facultyId;

    @Column(name = "advisorId")
    private Integer advisorId;

    // Getters and setters without constructor..

这是 MyUserDetails 扩展 UserDetails MyUserDetails.java

public class MyUserDetails implements UserDetails {
    private Integer id;
    private String username;
    private String firstname;
    private String lastname;
    private String password;
    private List<GrantedAuthority> authorities;
    private String email;
    private String lastLoginDate;
    private String registrationDate;
    private String lastLoginIp;
    private Integer balance;
    private Integer status;
    private String birthDate;
    private Integer departmentId;
    private Integer facultyId;
    private Integer advisorId;

    public MyUserDetails(Users user) {
        this.id = user.getId();
        this.username = user.getUsername();
        this.firstname = user.getFirstname();
        this.lastname = user.getLastname();
        this.password = user.getPassword();
        this.authorities = Arrays.stream(user.getRoles().split(","))
                .map(SimpleGrantedAuthority::new)
                .collect(Collectors.toList());
        this.email = user.getEmail();
        this.lastLoginDate = user.getLastLoginDate();
        this.registrationDate = user.getRegistrationDate();
        this.lastLoginIp = user.getLastLoginIp();
        this.balance = user.getBalance();
        this.status = user.getStatus();
        this.birthDate = user.getBirthDate();
        this.departmentId = user.getDepartmentId();
        this.facultyId = user.getFacultyId();
        this.advisorId = user.getAdvisorId();
    }

    public MyUserDetails() {
    }

    // Getters and setters..

UsersRepository.java

public interface UserRepository extends JpaRepository<Users, Integer> {
    Optional<Users> findByUsername(String username);
}

MyUserDetailsService.java

@Service
public class MyUserDetailsService implements UserDetailsService {
    @Autowired
    private UserRepository userRepository;

    // Change user password
    public String changePassword(Users users, MyUserDetails myUserDetails, String newPassword, String newPassword1, String oldPassword) {
        if (oldPassword.equals(myUserDetails.getPassword())) {
            if (oldPassword.equals(newPassword)) {
                return "New password cannot be the same as the old";
            } else if (!newPassword.equals(newPassword1)) {
                return "Passwords mismatches";
            } else if (newPassword.length() < 8) {
                return "New password too short";
            } else if (!newPassword.matches(".*")) {
                return "New password must contain at least 1 number";
            } else {
                users.setFirstname(myUserDetails.getFirstname());
                users.setLastname(myUserDetails.getLastname());
                users.setPassword(newPassword);
                users.setRoles(String.valueOf(myUserDetails.getAuthorities()));
                users.setEmail(myUserDetails.getEmail());
                users.setLastLoginDate(myUserDetails.getLastLoginDate());
                users.setRegistrationDate(myUserDetails.getRegistrationDate());
                users.setLastLoginIp(myUserDetails.getLastLoginIp());
                users.setBalance(myUserDetails.getBalance());
                users.setStatus(myUserDetails.getStatus());
                users.setBirthDate(myUserDetails.getBirthDate());
                users.setFacultyId(myUserDetails.getFacultyId());
                users.setAdvisorId(myUserDetails.getAdvisorId());
                users.setUsername(myUserDetails.getUsername());
                users.setDepartmentId(myUserDetails.getDepartmentId());
                userRepository.save(users);
                return "Password has been successfully changed";
            }
        } else {
            return "Password is wrong";
        }
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Optional<Users> user = userRepository.findByUsername(username);

        user.orElseThrow(() -> new UsernameNotFoundException("Not found: " + username));

        return user.map(MyUserDetails::new).get();
    }
}

用户表

+----+-----------+----------+----------+-----------+--------+---------------+------------------+-------------+---------+--------+-----------+-----------+-----------+----------+--------------+
| id | firstname | lastname | password | roles     | email  | lastLoginDate | registrationDate | lastLoginIp | balance | status | birthDate | facultyId | advisorId | username | departmentId |
+----+-----------+----------+----------+-----------+--------+---------------+------------------+-------------+---------+--------+-----------+-----------+-----------+----------+--------------+
|  2 | damir     | esenov   | admin    | student   | damir  | NULL          | NULL             | NULL        |    NULL |   NULL | NULL      | 1         | 1         | admin    | 1            |
|  3 | rapkat    | baudunov | rapkat   | NULL      | rapkat | NULL          | NULL             | NULL        |    NULL |   NULL | NULL      | NULL      | NULL      | rapkat   | NULL         |
| 15 | damir     | esenov   | admin123 | [student] | damir  | NULL          | NULL             | NULL        |    NULL |   NULL | NULL      | 1         | 1         | admin    | 1            |
+----+-----------+----------+----------+-----------+--------+---------------+------------------+-------------+---------+--------+-----------+-----------+-----------+----------+--------------+

我在 PostMan 中的请求(我已将请求更改为 PUT 方法) Postman

{
    "oldPassword":"admin",
    "newPassword":"admin123",
    "newPassword1":"admin123"
}

由于usersid是 null 所以 JPA 将其视为新用户,为什么要在数据库中创建新行。 所以只需在 else 中设置usersid

users.setId(myUserDetails.getId());

更好的解决方案:

如果您只需要更改密码,则无需设置所有字段。 首先通过id获取用户,然后设置密码并保存。

users = userRepository.findById(myUserDetails.getId()).get();
users.setPassword(newPassword);
userRepository.save(users);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM