回顧
上週我們主要做了兩個事情:
- 利用shiro的認證器實現了一個登錄接口
- 利用shiro的授權器實現了接口的訪問限制
接口: 添加用戶
還記得我們的addUser
接口嗎?
@ApiImplicitParams({
@ApiImplicitParam(name = "token", value = "鑑權用戶",required = true,paramType = "header")
})
@GetMapping("/addUser")
@RequiresRoles(value = {"admin","manager"},logical = Logical.OR)
public ResultJson addUser(){
return new ResultJson("200","成功",null);
}
當時我們只是爲了測試shiro對接口的權限管理, 僅僅只是簡單的返回了個成功的信息而已, 並沒有實際上的操作, 接下來我們就來完善這個接口吧!
實現步驟現在應該要很清晰了, 如果忘了可以看下圖
一般來說, 在添加一個新用戶的同時, 應該將用戶的角色同時分配好, 那麼參數應該有三個: (用戶名, 密碼, 角色名);
也就是說, 我們會涉及到三張表: 用戶表, 用戶角色表, 角色表
實現思路:
- 通過角色名在角色表中取得角色ID
- 在用戶表中插入數據
- 通過用戶名稱來取得新增的用戶ID
- 在用戶角色表中插入用戶對應的角色
在UserRoleInfoMapper.java
中新增一個根據角色名取得角色ID的方法
public interface RoleInfoMapper {
int insert(RoleInfo record);
//根據角色名取得角色ID
int findRoleIDByRoleName(@Param("roleName") String roleName);
}
接着來到UserRoleInfoMapper.xml
中添加對應的SQL語句
<select id="findRoleIDByRoleName" resultType="INTEGER">
SELECT role_id
FROM role_info
WHERE role_name=#{roleName,jdbcType=VARCHAR}
LIMIT 1
</select>
這樣我們查詢角色ID的mappper就搞定了
然後我們來做第二步: 插入用戶信息
插入用戶信息的功能其實我們已經在測試類裏寫過一個testInsert
這段代碼只要複製過來做個小小的改動就能用了! 這裏就不贅述了
如果你還記得shiro的認證器的話, 其實通過用戶名稱來取得用戶ID的mapper我們也有了:在UserInfoMapper
中的findFirstByUserName
再看UserRoleMapper
中insert
方法, 用戶角色表的插入mapper也寫好了
那麼只剩下service層的操作了, 無比簡單
在UserService
中新增一個addUser的方法
public interface UserService {
UserInfo getUserInfo(String userName);
Set<String> getUserRoles(Integer userID);
Set<String> getUserPermissions(Integer userID);
void addUser(String userName,String password,String roleName);
}
到UserServiceImpl
中去實現它
@Override
public void addUser(String userName, String password, String roleName) throws Exception {
//根據角色名稱獲取角色ID
int roleID = roleInfoMapper.findRoleIDByRoleName(roleName);
//插入用戶記錄
UserInfo userInfo = new UserInfo();
userInfo.setUserName(userName);
String salt = UUID.randomUUID().toString().replace("-","");
userInfo.setSalt(salt);
SimpleHash simpleHash = new SimpleHash(Md5Hash.ALGORITHM_NAME,password,salt,512);
userInfo.setPassword(simpleHash.toString());
userInfo.setCreateTime(new Date());
userInfo.setUserState(Byte.parseByte("0"));
userInfoMapper.insert(userInfo);
//插入用戶記錄完成後根據用戶名稱獲取用戶ID
UserInfo userInfoResult = userInfoMapper.findFirstByUserName(userName);
//插入用戶角色信息
UserRole userRole = new UserRole();
userRole.setRoleId(roleID);
userRole.setUserId(userInfoResult.getUserId());
userRoleMapper.insert(userRole);
}
最後來到UserController
完善添加用戶的接口
@PostMapping("/addUser")
@RequiresRoles(value = {"admin","manager"},logical = Logical.OR)
public ResultJson addUser(String userName,String password,String roleName){
try {
userService.addUser(userName,password,roleName);
return new ResultJson("200","成功",null);
}catch (Exception e){
return new ResultJson("400","失敗",e.toString());
}
}
接口: 刪除用戶
做了這麼多遍了, 這個已經是無比簡單了! ! ! 這裏我很想寫一個 略
不過還是來簡單分析下吧. 後端接收到用戶名, 通過用戶名來刪除用戶信息;
那麼試想下, 如果我現在直接去刪除用戶表的用戶記錄的話, 應該是刪除不掉的, 因爲在用戶角色表中, 有我們的用戶角色記錄; 也就是說, 在刪除用戶信息之前, 應該先把用戶角色的記錄給刪除掉
實現思路:
- 通過用戶名來取得用戶ID
- 通過用戶ID來刪除用戶角色表中的對應信息
- 通過用戶ID來刪除用戶表中的對應信息
對應到實際操作:
- 利用在
UserInfoMapper
中的findFirstByUserName
取得用戶ID UserRoleMapper
中編寫刪除的方法和與其對應的SQL語句UserService
層中編寫對應的刪除方法, 並在UserServiceImpl
中實現它- 最後在
UserController
中編寫接口
自己試着寫一下吧, 這裏我就不貼上源碼了