链接:https://pan.baidu.com/s/173HysoAbd9o3C1KfAQ_taA
提取码:thk6
这个临时授权有简单有难的,我做的算是最简单的,能实现一些基本的功能,只有在指定的时间段内可以访问
临时授权思路1.数据库设计,在用户表添加三个字段:start_date(开始时间) ,end_date(结束时间),authorizer(授权人)
2.超级管理员admin登录,给某一个用户授予临时权限(传递参数:临时授权人 id,开始时间start_date,结束时间 end_date)
3,从消息头中获取token,根据token查询当前登陆人(就是授权人authorizer)
4,通过前端传递的临时授权人id查询被授权人是否存在,如果不存在返回错误信息
5.限制自己不能给自己授权
6,修改被授权人的信息
验证当前用户权限思路1.从消息头中获取token,根据token查询当前登陆人信息
2.判断是否是管理员,如果是管理员拥有全部权限
3.判断是否被授权,(获取临时授权时设置的开始时间,结束时间,当前时间),
获取这个三个时间的时间戳,判断当前时间是否在开始时间和结束时间之间
如果开始时间和结束时间为空的话表示当前登录对象未被临时授权,会执行后面的 4,5,6,
如果有时间,但是当前时间不在这个时间段也会执行 4,5,6
如果有时间,并且当前时间在这个时间段之中,就会直接返回true,
4.从请求头中获取当前接口的地址,
5.通过当前登录对象的id查询权限
6.判断当前登录对象的权限中是否包含当前接口的地址,如果包含,允许当前登录对象访问,如果不包含,则不允许当前登录人访问
部分代码: controller
@PostMapping("/grantpower")
public AjaxResult grantpower(@RequestBody People people, HttpServletRequest request, HttpServletResponse response) {
//获取当前登录对象名
String userName = getUserName(request.getHeader("token"));
//查询被授权人
People people2 = peopleMapper.selectById(people.getId());
if (StringUtils.isNull(people2)) {
return toAjax(0);
}
//自己不能给自己授权
if (userName.equals(people2.getUserName())) {
return toAjax(0);
}
//设置基本信息
people2.setUpdateBy(userName);
people2.setUpdateTime(new Date());
people2.setStartDate(people.getStartDate());
people2.setEndDate(people.getEndDate());
people2.setAuthorizer(userName);
//修改数据
return toAjax(peopleMapper.updateById(people2));
}
@GetMapping("/list")
public AjaxResult list(People people, HttpServletRequest request, HttpServletResponse response) {
if (verifyPermissions(request)) {
return AjaxResult.error(HttpStatus.UNAUTHORIZED, "非法访问,请先登录");
}
//判断是否有权限
if (!competence(request)) {
return AjaxResult.error(HttpStatus.UNAUTHORIZED, "您没有权限访问,只有充钱才能让你变得更加强大,请充钱......");
}
List list = peopleService.selectAll(people);
return AjaxResult.success(list);
}
public boolean competence(HttpServletRequest request) {
//获取当前登录对象的全部信息
People people = peopleMapper.selectById(getUserId(request.getHeader("token")));
//管理员拥有全部权限
if (Constant.SUPER_ADMIN.equals(people.getUserName())) {
return true;
}
//判断是否被授权
//防止空指针
if (people.getStartDate() != null && people.getEndDate() != null) {
if (dateUtils.ifDate(people.getStartDate(), people.getEndDate(), new Date())) {
return true;
}
}
//从请求头中获取的地址
String requestURI = request.getRequestURI();
//通过角色id查询当前登陆对象的所有权限
List list = powerMapper.selectUrl(people.getRoleid());
ArrayList stringList = new ArrayList<>();
if (!StringUtils.isEmpty(list)) {
list.forEach(r -> {
stringList.add(r.getUrl());
});
return lsitUtils.ifcontainString(stringList, requestURI);
}
return false;
}
public boolean ifDate(Date startDate, Date endDaate, Date currentDate) {
long time = startDate.getTime();
long time1 = endDaate.getTime();
long time2 = currentDate.getTime();
if (time2 > time && time2 < time1) {
return true;
} else {
return false;
}
}
测试结果:
“ww”账号登录查询全部数据
1.获取验证码
2.ww获取token
获取的token(eyJhbGciOiJIUzI1NiJ9eyJqdGkiOiJmMDI3OWI3NC1kZWRmLTQ4ODAtOTQxYS1jOGVjZjJjMzVkZWYiLCJpYXQiOjE2NTE3Mzg0OTAsInN1YiI6InRoayIsImlzcyI6InN0YWZmIiwiZXhwIjoxNjUxNzQwMjkwfQ_NQwGJYFVGx9VCvGKNGJbWFyudJCxVMQsOs5PbE8wZc)
3.查询全部数据,查询失败了
我们登录admin账号,给ww这个账号进行临时授权
1.获取验证码
2.admin账号获取token
获取的token(eyJhbGciOiJIUzI1NiJ9eyJqdGkiOiI1ZDIxYTUzNi1hN2Q3LTRlODYtYjgxZS1kNDNkZjU3YzBmMzIiLCJpYXQiOjE2NTE3Mzg3ODksInN1YiI6InRoayIsImlzcyI6InN0YWZmIiwiZXhwIjoxNjUxNzQwNTg5fQCC4WgNZWBbnxn0lWinKpEPRaPxksMR8wPCvRZsuA9W8)
3.admin查询全部数据 4.用admin账号给ww账号授予临时权限,让ww也可以查询全部数据 数据库: 授权前 授权后: 5.ww用户再次查询全部数据授权成功,ww用户也可以查询到数据了,但是只有在开始时间(2022-05-05 14:00:00),结束时间(2022-05-06 14:00:00)之中可以访问,其他时间都不可以访问,简单临时授权就这样了,难的就不写了,麻烦,比如限制到具体的某一个接口,这上面的这种授权是通过时间段来进行授权的,只要在这个时间段,什么接口都可以访问,这个时间段结束之后,那么就只能访问它自己拥有的权限了,如果有其他的想法大家可以互相交流交流,谢谢



