权限管理

权限管理的设计

页面权限(菜单级)

粗粒度权限,不同用户登录系统后,看到不同的菜单

操作权限(按钮级)

细粒度权限,比如在用户管理中有具体的功能(按钮):增加、删除、修改等

数据权限

没遇到,此处不讨论

实现思路

总体实现思路:用户登录,登录后获取 用户可以操作的菜单(按钮)权限,进行显示和相关操作。

要实现的接口:
1. 用户登录
2. 登录之后,获取用户可以操作的菜单、按钮。

用户登录接口分析

用户登录接口分析:
1. 根据用户名查询用户是否存在
2. 如果用户存在,判断用户是否被禁用(status = 0)
3. 登录成功后,保持登录状态
——可以基于token实现:
根据登录信息(id,name等)生成唯一的字符串,对生成的字符串进行编码加密
把字符串放入cookie里,从cookie获取用户信息
但是cookie不能进行跨域传递(前端项目端口号为9528,后端为8800,产生跨域)
解决方法:每次发送请求时,把cookie值放入请求头,每次从请求头获取用户信息

获取用户可以操作的菜单、按钮

登陆后,获取用户可以操作的菜单、按钮
1.从请求头获取token字符串,进而获取用户id
2.根据用户id查询用户可以操作的菜单及按钮(多表查询)

具体实现

用户登录

登录信息生成字符串,对字符串进行加密的操作,可以自己设置加密操作实现,也可以使用工具JWT。

JWT工具的使用

    @PostMapping("login")
    public Result login(@RequestBody LoginVo loginVo){
//        HashMap<String , Object> map = new HashMap<>();
//        map.put("token","admin");
        //判断用户是否存在
        String username = loginVo.getUsername();
        LambdaQueryWrapper<SysUser> userWrapper = new LambdaQueryWrapper<>();
        userWrapper.eq(SysUser::getUsername,username);
        SysUser user = userService.getOne(userWrapper);
        if (user == null){
            throw new MyException(500,"用户不存在");
        }
        //判断密码
        if (!user.getPassword().equals(MD5.encrypt(loginVo.getPassword()))){
            throw new MyException(500,"密码错误");
        }
        //判断用户是否被禁用
        if (user.getStatus().intValue()==0){
            throw new MyException(500,"用户被禁用");
        }

        //根据id和name生成token字符串
        String token = JwtHelper.createToken(user.getId(), user.getUsername());
        HashMap<String, Object> map = new HashMap<>();
        map.put("token",token);
        return Result.ok(map);

    }

登录之后,获取用户可以操作的菜单、按钮

posted @ 2023-07-31 16:54  ︶ㄣ演戲ㄣ  阅读(15)  评论(0)    收藏  举报