Springboot 临时授权

导读:本篇文章讲解 Springboot 临时授权,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

以下代码只是部分代码,全部代码链接:

链接: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.获取验证码

Springboot 临时授权

2.ww获取token

获取的token(eyJhbGciOiJIUzI1NiJ9eyJqdGkiOiJmMDI3OWI3NC1kZWRmLTQ4ODAtOTQxYS1jOGVjZjJjMzVkZWYiLCJpYXQiOjE2NTE3Mzg0OTAsInN1YiI6InRoayIsImlzcyI6InN0YWZmIiwiZXhwIjoxNjUxNzQwMjkwfQ_NQwGJYFVGx9VCvGKNGJbWFyudJCxVMQsOs5PbE8wZc)

Springboot 临时授权

 3.查询全部数据,查询失败了

Springboot 临时授权

 我们登录admin账号,给ww这个账号进行临时授权

1.获取验证码

Springboot 临时授权

2.admin账号获取token

获取的token(eyJhbGciOiJIUzI1NiJ9eyJqdGkiOiI1ZDIxYTUzNi1hN2Q3LTRlODYtYjgxZS1kNDNkZjU3YzBmMzIiLCJpYXQiOjE2NTE3Mzg3ODksInN1YiI6InRoayIsImlzcyI6InN0YWZmIiwiZXhwIjoxNjUxNzQwNTg5fQCC4WgNZWBbnxn0lWinKpEPRaPxksMR8wPCvRZsuA9W8)

Springboot 临时授权 3.admin查询全部数据

Springboot 临时授权

 4.用admin账号给ww账号授予临时权限,让ww也可以查询全部数据

Springboot 临时授权

数据库:

授权前

Springboot 临时授权

授权后:

Springboot 临时授权

5.ww用户再次查询全部数据

Springboot 临时授权

授权成功,ww用户也可以查询到数据了,但是只有在开始时间(2022-05-05 14:00:00),结束时间(2022-05-06 14:00:00)之中可以访问,其他时间都不可以访问,简单临时授权就这样了,难的就不写了,麻烦,比如限制到具体的某一个接口,这上面的这种授权是通过时间段来进行授权的,只要在这个时间段,什么接口都可以访问,这个时间段结束之后,那么就只能访问它自己拥有的权限了,如果有其他的想法大家可以互相交流交流,谢谢

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/119872.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!