前言
在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;
}
}
可以看到,这里备份时,已经能正确的获取到用户信息了
修改之前,这里会看到一个麻花一样的字符串,非常的影响观感