🍣

Re:ゼロから始めるSpring Boot実践#1 WebBlog開発#8 パスワード変更

に公開

機能一覧※再掲

  1. ユーザ
    1.1 新規登録
    1.2 ログイン
    1.3 ユーザ情報取得
    1.4 ユーザ情報更新
    1.5 アバター画像変更
    1.6 パスワード変更 ← 本記事の内容
  2. 記事カテゴリ
  3. 記事管理

API設計

1.5.1 APIの基本情報

  • リクエストパス:/updatePassword
  • リクエスト方式:PATCH

1.5.2 リクエストパラメータ

  • リクエストパラメータ形式:json
  • リクエストデータ例:
{
    "old_password":"123456",
    "new_password":"123456",
    "re_password":"234567"
}

1.5.3 レスポンスデータ

  • レスポンスデータ形式:application/json
  • レスポンスパラメータの説明:
{
    "code": 0,
    "message": "操作完了",
    "data": null
}

API開発

1. 開発するメソッド・クラスを考える

1.1 ユーザ情報更新

2. Controller作成

UserControllerクラスに以下のメソッドを追加

    @PatchMapping("/updatePassword")
    public Result updatePassword(@RequestBody Map<String,String> params){
        // パラメータのバリデーション
        String oldPassword = params.get("old_password");
        String newPassword = params.get("new_password");
        String rePassword  = params.get("re_password");

        if(!StringUtils.hasLength(oldPassword) || !StringUtils.hasLength(newPassword) || !StringUtils.hasLength(rePassword)) {
            return Result.error("入力データは不足しています。");
        }

        Map<String, Object> map = ThreadLocalUtil.get();
        String username = (String) map.get("username");
        User loginUser = userService.findByUserName(username);
        if(!loginUser.getPassword().equals(Md5Util.getMD5String(oldPassword))){
            return Result.error("入力された現在のパスワードは正しくありません。");
        }
        if(!newPassword.equals(rePassword)){
            return Result.error("2回入力された新しいパスワードは異なります。");
        }
        userService.updatePassword(newPassword);
        return Result.success();
    }

4. SeriveとMapperの作成

  • UserServiceImplクラスに以下のメソッドを追加
    @Override
    public void updatePassword(String password) {
        Map<String, Object> map = ThreadLocalUtil.get();
        Integer id = (Integer) map.get("id");
        userMapper.updatePassword(Md5Util.getMD5String(password),id);
    }
  • UserMapperクラスに以下のメソッドを追加
    // パスワード変更
    @Update("update rezerosb_weblog.user set password=#{password}, update_time=now() where id=#{id}")
    void updatePassword(String password, Integer id);

APIテスト

PostmanでAPIを実行してみた。

Discussion