【magic-api】解决magic-api备份时,无法正确获取到用户名的问题

前言

在ruoyi框架中集成magic-api时遇到一个问题,在做接口备份的时候,总是备份不成功,查看后台日志,发现,提示create_by字段存入的数据过长,在加长以后,就得到一个对象字符串。
com.ocb.project.system.user.domain.User@7b292662[
  userId=1
  deptId=103
  loginName=admin
  userName=若依
  userType=00
  email=ry@163.com
  phonenumber=15888888888
  sex=1
  avatar=
  password=29c67a30398638269fe600f73a054934
  salt=111111
  status=0
  delFlag=0
  loginIp=127.0.0.1
  loginDate=Tue Aug 13 14:46:04 CST 2024
  createBy=admin
  createTime=Tue Aug 13 14:46:04 CST 2024
  updateBy=
  updateTime=<null>
  remark=管理员
  dept=com.ocb.project.system.dept.domain.Dept@1f63a475[
  deptId=103
  parentId=101
  ancestors=0,100,101
  deptName=研发部门
  orderNum=1
  leader=若依
  phone=<null>
  email=<null>
  status=0
  delFlag=<null>
  createBy=<null>
  createTime=<null>
  updateBy=<null>
  updateTime=<null>
]
  roles=[com.ocb.project.system.role.domain.Role@261b2300[
  roleId=1
  roleName=超级管理员
  roleKey=admin
  roleSort=1
  dataScope=1
  status=0
  delFlag=<null>
  createBy=<null>
  createTime=<null>
  updateBy=<null>
  updateTime=<null>
  remark=<null>
]]
]
可以看到,这是一个user对象的序列化字符串。

寻找原因

在magic-api的源码中查找获取登录用户名的方法
	@PostMapping("/backup/full")
	@ResponseBody
	public JsonBean<Boolean> doBackup() throws IOException {
		notNull(service, BACKUP_NOT_ENABLED);
		service.doBackupAll("主动全量备份", WebUtils.currentUserName());
		return new JsonBean<>(true);
	}

可以看到,使用的是WebUtils获取了当前用户

	public static String currentUserName() {
		Optional<MagicHttpServletRequest> request = Optional.ofNullable(magicRequestContextHolder.getRequest());
		return request.map(r -> (MagicUser) r.getAttribute(Constants.ATTRIBUTE_MAGIC_USER))
				.map(MagicUser::getUsername)
				.orElseGet(() -> request.map(MagicHttpServletRequest::getUserPrincipal)
						.map(Principal::getName)
						.orElse(null)
				);
	}

解决方法

可以看到,这里的逻辑是,尝试获取magicapi自己的标准化用户信息,如果没有获取到,就使用 Principal 的getName方法,否则,返回null
Principal 是java.security下的一个接口,我们要做的就是,在magicapi获取到的用户类上实现这个接口的getName方法就可以了
public class User extends BaseEntity implements Principal
{
    /** 登录名称 */
    @Excel(name = "登录名称")
    private String loginName;
    
    public String getName() {
    	return this.loginName;
    }
}

在这里插入图片描述

可以看到,这里备份时,已经能正确的获取到用户信息了
修改之前,这里会看到一个麻花一样的字符串,非常的影响观感

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值