• 如何让Java项目兼容更多的客户端设备(二)


    如何让Java项目兼容更多的客户端设备(二)

    ​ 一、Token认证的原理

    传统的单体JavaWeb项目通常采用HttpSession保存登陆成功的凭证,但是HttpSession需要浏览器的Cookie机制配合。也就是说Web项目的客户端只能是浏览器,不可以是APP、机顶盒、智能家电等。
    在这里插入图片描述

    为了让Java项目兼容更多的客户端设备,所以我们要放弃在客户端用Cookie保存SessionId的做法。我们在服务端生成Token字符串,然后交给客户端保存。APP也好、浏览器也好、机顶盒也好,都能保存字符串。每次发送HTTP请求的时候,在请求头上附带Token字符串,SaToken框架就能解析出该Token是否合法,如果没有问题,就允许客户端请求后端的Web方法。
    在这里插入图片描述

    即便有人破解了SaToken生成令牌的算法,我们也不用担心,因为我们开启了Redis保存Token副本的功能。如果SaToken检测到请求头的Token在Redis中没有缓存副本,那么这个Token肯定是伪造的,所以就拒绝请求。另外Redis中的Token有过期时间,客户端提交的Token是过期的,SaToken也能判断出来,然后拒绝请求。

    二、判断是否登陆

    想要判断用户是否已经在客户端登陆,我们在Web方法上添加@SaCheckLogin注解即可。SaToken只要检测到Token是有效的,就会允许HTTP请求调用该Web方法。

    @PostMapping("/createFaceModel")
    @SaCheckLogin
    public R createFaceModel(@RequestBody @Valid CreateFaceModelForm form) {
        int userId = StpUtil.getLoginIdAsInt();
        form.setUserId(userId);
        Map param = BeanUtil.beanToMap(form);
        faceAuthService.createFaceModel(param);
        return R.ok();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    无论哪位用户登陆小程序,拥有的权限都是相同的。不存在不同身份的人去登用户端小程序,能登陆用户端小程序的人,都是相同身份的人。所以后端Java项目不需要判断他们是否具备不同的权限,这些用户具有相同的权限,因此我们只需要判断他们是否登陆即可。

    三、判断是否具有权限

    在MIS端登陆的用户可能是超级管理员,也可能是普通人员,他们拥有的权限是不同的。所以我们要在hospital-api项目中验证用户是否登陆,而且还要验证他们是否具备相关的权限才能调用某个Web方法。这需要用到@SaCheckPermission注解了。

    @PostMapping("/searchByPage")
    @SaCheckLogin
    @SaCheckPermission(value = {"ROOT", "DOCTOR:SELECT"}, mode = SaMode.OR)
    public R searchByPage(@RequestBody @Valid SearchDoctorByPageForm form) {
        Map param = BeanUtil.beanToMap(form);
        int page = form.getPage();
        int length = form.getLength();
        int start = (page - 1) * length;
        param.put("start", start);
        PageUtils pageUtils = doctorService.searchByPage(param);
        return R.ok().put("result", pageUtils);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    每当SaToken框架执行到@SaCheckPermission注解的时候,就会调用StpInterfaceImpl类。从里面的getPermissionList()函数中获取用户具备的权限,然后跟注解要求的权限比对。如果用户拥有相关权限就可以调用Web方法,否则就拒绝请求抛出异常。

    @Component
    public class StpInterfaceImpl implements StpInterface {
        @Resource
        private MisUserDao userDao;
    
        /**
         * 返回一个用户所拥有的权限集合
         */
        @Override
        public List<String> getPermissionList(Object loginId, String loginKey) {
            int userId = Integer.parseInt(loginId.toString());
            ArrayList<String> list = userDao.searchUserPermissions(userId);
            return list;
        }
    
    
        /**
         * 返回一个用户所拥有的角色标识集合
         */
        @Override
        public List<String> getRoleList(Object loginId, String loginKey) {
            return null;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    也可以使用Shiro和SpringSecurity,但Shiro和SpringSecurity都没有内置JWT功能,而且额外配置过程非常繁琐

    Sa-Token

  • 相关阅读:
    三年城市NOH落地100城,毫末智行内部信剑指2025
    1.全排列-(DFS)
    推荐一个Dapper扩展CRUD基本操作的开源库
    如何从iPhone恢复错误删除的照片
    扫雷(蓝桥杯)
    别再问我如何制作甘特图了!
    C++数据结构 -- 哈希表
    Linux解压、压缩常用命令
    MySQL操作合集
    ERROR [main] regionserver.HRegionServer: Failed construction RegionServer
  • 原文地址:https://blog.csdn.net/qq_61551764/article/details/128088767