权限管理
权限管理的设计
页面权限(菜单级)
粗粒度权限,不同用户登录系统后,看到不同的菜单
操作权限(按钮级)
细粒度权限,比如在用户管理中有具体的功能(按钮):增加、删除、修改等
数据权限
没遇到,此处不讨论
实现思路
总体实现思路:用户登录,登录后获取 用户可以操作的菜单(按钮)权限,进行显示和相关操作。
要实现的接口:
1. 用户登录
2. 登录之后,获取用户可以操作的菜单、按钮。
用户登录接口分析
用户登录接口分析:
1. 根据用户名查询用户是否存在
2. 如果用户存在,判断用户是否被禁用(status = 0)
3. 登录成功后,保持登录状态
——可以基于token实现:
根据登录信息(id,name等)生成唯一的字符串,对生成的字符串进行编码加密
把字符串放入cookie里,从cookie获取用户信息
但是cookie不能进行跨域传递(前端项目端口号为9528,后端为8800,产生跨域)
解决方法:每次发送请求时,把cookie值放入请求头,每次从请求头获取用户信息
获取用户可以操作的菜单、按钮
登陆后,获取用户可以操作的菜单、按钮
1.从请求头获取token字符串,进而获取用户id
2.根据用户id查询用户可以操作的菜单及按钮(多表查询)
具体实现
用户登录
登录信息生成字符串,对字符串进行加密的操作,可以自己设置加密操作实现,也可以使用工具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);
}
浙公网安备 33010602011771号