以下代码只是部分代码,全部代码链接:
链接: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
/** * 临时授权 * * @param people * @return */ @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)); }
/** * 查询全部用户 不分页 * * @param people * @param request * @param response * @return */ @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<People> list = peopleService.selectAll(people); return AjaxResult.success(list); }
/** * 判断是否有权限 * * @param request * @return */ 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<Power> list = powerMapper.selectUrl(people.getRoleid()); ArrayList<String> stringList = new ArrayList<>(); if (!StringUtils.isEmpty(list)) { list.forEach(r -> { stringList.add(r.getUrl()); }); return lsitUtils.ifcontainString(stringList, requestURI); } return false; }
/** * 判断一个时间是否在另外两个时间段之内 * * @param startDate 开始时间 * @param endDaate 结束时间 * @param currentDate 当前时间 * @return */ 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)之中可以访问,其他时间都不可以访问,简单临时授权就这样了,难的就不写了,麻烦,比如限制到具体的某一个接口,这上面的这种授权是通过时间段来进行授权的,只要在这个时间段,什么接口都可以访问,这个时间段结束之后,那么就只能访问它自己拥有的权限了,如果有其他的想法大家可以互相交流交流,谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/119872.html