回顧
上週內容比較簡單, 只有兩個接口:
- 添加用戶
- 刪除用戶
接口: 重置密碼
用戶修改自己的密碼, 是一個很常見的需求; 除此, 用戶有可能忘記自己的密碼, 需要讓管理員爲其重置密碼. 接下來我們就來編寫這兩個接口吧.
接口: 管理員重置密碼
需求分析:
管理員重置用戶密碼只需要知道用戶名即可,不需要從前端接收新的密碼, 我們可以在後端直接爲用戶生成一個固定的密碼,如:123456
首先我們在mapper層編寫重置密碼的方法和對應的sql語句
1.打開UserInfoMapper.java
新增一個更新密碼的方法
int updateUserPasswordByUserID(@Param("userID")int userID,@Param("password")String password, String salt);
2.打開UserInfoMapper.xml
編寫更新密碼的sql語句
<update id="updateUserPasswordByUserID">
UPDATE user_info
SET `password` = #{password},
salt = #{salt}
WHERE user_id= #{userID}
</update>
3.打開UserService
編寫業務方法
void resetPassword(String userName) throws Exception;
4.打開UserServiceImpl
去實現3方法的具體操作
@Override
public void resetPassword(String userName) throws Exception {
//首先我們通過用戶名取到用戶ID
int userID = userInfoMapper.findFirstByUserName(userName).getUserId();
//初始化密碼爲123456
String password = "123456";
//利用UUID生成隨機的鹽值
String salt = UUID.randomUUID().toString().replace("-","");
//使用MD5算法和鹽值生成密文
SimpleHash simpleHash = new SimpleHash(Md5Hash.ALGORITHM_NAME,password,salt,512);
//修改數據庫中對應用戶的鹽值和密文
userInfoMapper.updateUserPasswordByUserID(userID,simpleHash.toString(),salt);
}
5.最後在UserController
中調用service的方法
@PutMapping("/resetPassword")
@RequiresRoles(value = {"admin"},logical = Logical.OR)
@ApiImplicitParams({
@ApiImplicitParam(name = "token", value = "鑑權用戶",required = true,paramType = "header"),
@ApiImplicitParam(name = "userName")
})
public ResultJson resetPassword(String userName){
try {
userService.resetPassword(userName);
return new ResultJson("200","密碼成功重置爲123456","");
}catch (Exception e){
return new ResultJson("400","failed","");
}
}
接口: 用戶重置密碼
需求分析:
- 用戶必須是登錄狀態
- 要求用戶輸入舊密碼進行驗證
- 輸入新密碼
由於對數據庫的操作是一模一樣的, 所以我們mapper層就不用再寫一次了, 複用剛纔寫好的就行啦! 直接從service層開始就好
1.打開UserService
編寫用戶修改的業務方法
void resetSelfPassword(String userName, String password) throws Exception;
2.在UserServiceImpl
中實現它
@Override
public void resetSelfPassword(String userName, String password) throws Exception {
//這裏業務邏輯和管理員重置密碼幾乎一樣
//唯一的差別就是用戶重置的密碼的通過前端傳來的, 而不是一個固定的值
//注意考慮考慮代碼複用的問題, 這就留給你們自己思考啦!
//通過用戶名取得用戶ID
int userID = userInfoMapper.findFirstByUserName(userName).getUserId();
//使用UUID生成隨機的鹽值
String salt = UUID.randomUUID().toString().replace("-","");
//通過MD5算法和鹽值共同生成密文
SimpleHash simpleHash = new SimpleHash(Md5Hash.ALGORITHM_NAME,password,salt,512);
//修改數據庫中對應用戶的鹽值和密文
userInfoMapper.updateUserPasswordByUserID(userID,simpleHash.toString(),salt);
}
3.最後在UserController
中編寫接口
@ApiImplicitParams({
@ApiImplicitParam(name = "token", value = "鑑權用戶", required = true, paramType = "header"),
@ApiImplicitParam(name = "oldPassword", value = "舊密碼", required = true),
@ApiImplicitParam(name = "newPassword", value = "新密碼", required = true)
})
@PutMapping("/resetSelfPassword")
public ResultJson resetSelfPassword(String oldPassword, String newPassword){
//由於用戶已經是登錄的, 這裏可以直接取出用戶的信息
Subject subject = SecurityUtils.getSubject();
UserInfo userInfo = (UserInfo) subject.getPrincipals().getPrimaryPrincipal();
String userName = userInfo.getUserName();
String salt = userInfo.getSalt();
//將用戶傳入的舊密碼和數據庫中的密碼進行匹配
//注意我們數據庫中存儲的密碼是密文, 且MD5加密算法不可逆
//所以我們要將用戶傳入的舊密碼進行加密,用密文和數據庫中的密碼進行匹配
SimpleHash simpleHash = new SimpleHash(Md5Hash.ALGORITHM_NAME,oldPassword,salt,512);
if(!simpleHash.toString().equals(userInfo.getPassword())){
return new ResultJson("400","修改密碼失敗, 原密碼不匹配!",null);
}else {
try {
userService.resetSelfPassword(userName,newPassword);
return new ResultJson("200","密碼修改成功!",null);
}catch (Exception e){
e.printStackTrace();
return new ResultJson("400","密碼修改失敗",null);
}
}
}
這樣我們的兩個簡單的重置密碼接口就寫好啦.
常用的用戶接口
- 獲取所有用戶信息
- 根據用戶名獲取單個用戶信息
- 管理員修改用戶當前狀態
- 修改用戶所屬角色
接口: 根據用戶名獲取用戶信息
分析: 在實際應用中, 哪些數據是應該返回給前端的, 哪些數據是不應該的; 首先密碼, 鹽值這顯然不需要返回給用戶, 一般來說前端還會需要知道這個用戶所屬的角色, 甚至是用戶具有的權限等…
由於我們返回的數據類型比較複雜, 所以通常我們會用對象(JSON)的方式來展示數據, 一般來說會有個VO層, 有興趣的同學可以瞭解一下
1.編寫用來展示用戶數據的vo
2.在UserService
層中編寫方法, 並在UserServiceImpl
中實現它
3.在UserController
中調用service
4.結果: 最終我們拿到的數據格式就是這樣的啦
接口: 獲取所有用戶信息
能獲取一個, 獲取所有就很簡單啦, 這裏就不細寫了, 提示: 將前面我們寫的獲取單個用戶的service改造一下, 把返回值VoUserInfo改爲List< VoUserInfo>
給你們個結果參考吧:
接口: 管理員修改用戶狀態
用戶狀態我們在Shrio中有配置過, 如果其狀態2的時候, 禁用該用戶
那我們就來寫一個禁用用戶的接口吧
1.mapper中編寫sql和對應方法
2.service中編寫業務方法並在Impl層中實現它
3.controller中調用service
4.結果
嘗試使用剛纔禁用的用戶登錄:
接口啓用用戶同理, 這裏就不寫啦 !
接口: 修改用戶所屬角色
注意一個細節, 用戶和角色之間的關係是多對多,
前端在接收參數的時候應該是接收一個用戶名 和 角色名稱的數組
也就是說, 在數據庫中, 如果用戶ID爲1的用戶擁有多個角色, 在更新該用戶信息的時候的SQL就不應該使用update table set field=value
的方式! ! !
而應該將其所擁有的角色delete
再執行insert
1.mapper層編寫對應的sql
2.service層編寫對應的業務邏輯並在impl層實現它
3.controller層中調用service
4.結果:
我們先來看看用戶admin的角色信息
我們試着將其的manager角色刪除, 只保留admin角色
再試試將admin, manager, staff三個角色都賦給用戶admin