回顾
上周我们主要做了两个事情:
- 利用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
中编写接口
自己试着写一下吧, 这里我就不贴上源码了