加magic-api交流群请教群主解决了这一问题。
springboot版本2.3.6Release
Magic-api版本2.1.0
分为三步
1、配置编辑器
2、前端获取token
3、后端解析token
1、配置编辑器
参考:https://www.ssssssss.org/magic-api/pages/config/editor/#getmagictokenvalue
getMagicTokenValue: function(){
// 自行获取magic-api需要的token
return token;
}
指定后台配置文件:
magic-api.editor-config=classpath:./magic-editor-config.js
2、前端获取token
magic-editor-config.js:
var MAGIC_EDITOR_CONFIG = {
title: 'magic-api',
checkUpdate: false,
header: {
skin: false, // 屏蔽皮肤按钮
document: false, // 屏蔽文档按钮
repo: true, // 屏蔽gitee和github
qqGroup: true // 屏蔽加入QQ群
},
getMagicTokenValue: function(){
// 自行获取magic-api需要的token 这里我的magic-qpi在iframe里父级url中有token
var token = "";
var currentTopHref = window.top.location.href;
console.log('currentTopHref', currentTopHref);
var reg = new RegExp("(^|&)token=([^&]*)(&|$)");
var r = currentTopHref.match(reg);
if (r != null){
token = unescape(r[2]);
}
return token;
}
}
3、后端解析token
CustomAuthorizationInterceptor.class:
package com.jqp.admin.myapi.interceptor;
import com.jqp.admin.db.enums.JdbcInfoEnum;
import com.jqp.admin.util.TokenUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.ssssssss.magicapi.core.context.MagicUser;
import org.ssssssss.magicapi.core.exception.MagicLoginException;
import org.ssssssss.magicapi.core.interceptor.Authorization;
import org.ssssssss.magicapi.core.interceptor.AuthorizationInterceptor;
import org.ssssssss.magicapi.core.model.Group;
import org.ssssssss.magicapi.core.model.MagicEntity;
import org.ssssssss.magicapi.core.servlet.MagicHttpServletRequest;
@Component
public class CustomAuthorizationInterceptor implements AuthorizationInterceptor {
/**
* 配置是否需要登录
*/
@Override
public boolean requireLogin() {
// 設置需要登錄 这里必须设置为true 不然后边鉴权时 magicUser为空
return true;
}
@Override
public MagicUser getUserByToken(String token) throws MagicLoginException {
//對登錄人token處理 獲取magicUser信息
MagicUser magicUser = TokenUtil.getMagicUser(token);
if(magicUser!=null){
return magicUser;
}
throw new MagicLoginException("未登录");
}
/**
* 是否拥有对该接口的增删改权限
* 此方法可以不重写,则走默认的 boolean allowVisit(MagicUser magicUser, MagicHttpServletRequest request, Authorization authorization) 方法
*/
@Override
public boolean allowVisit(MagicUser magicUser, MagicHttpServletRequest request, Authorization authorization, MagicEntity entity) {
// Authorization.SAVE 保存
// Authorization.DELETE 删除
// Authorization.VIEW 查询
// Authorization.LOCK 锁定
// Authorization.UNLOCK 解锁
// 自行写逻辑判断是否拥有如果有,则返回true,反之为false
// 这里存疑 entity.getCreateBy(), entity.getUpdateBy() 会为空
return hasAuth(magicUser, entity.getCreateBy(), entity.getUpdateBy(), authorization);
}
/**
* 是否拥有对该分组的增删改权限
* 此方法可以不重写,则走默认的 boolean allowVisit(MagicUser magicUser, MagicHttpServletRequest request, Authorization authorization) 方法
*/
@Override
public boolean allowVisit(MagicUser magicUser, MagicHttpServletRequest request, Authorization authorization, Group group) {
// Authorization.SAVE 保存
// Authorization.DELETE 删除
// Authorization.VIEW 查询
// 自行写逻辑判断是否拥有如果有,则返回true,反之为false
// 这里存疑 entity.getCreateBy(), entity.getUpdateBy() 会为空
return hasAuth(magicUser, group.getCreateBy(), group.getUpdateBy(), authorization);
}
private boolean hasAuth(MagicUser magicUser, String createBy, String updateBy, Authorization authorization){
if(StringUtils.isEmpty(createBy)&&StringUtils.isEmpty(updateBy)){
//创建人和修改人为空 没有鉴权条件 直接通过
return true;
}
if(magicUser==null){
return false;
}
try {
//是否为本人
if ((magicUser.getUsername().split("-")[1]).equals(getUserCodeAndUserName(createBy, updateBy))) {
return true;
}
}catch (Exception e){
e.printStackTrace();
return false;
}
try {
if (Authorization.VIEW.equals(authorization)) {
String tenantId = getTenantId(createBy, updateBy);
if (StringUtils.isBlank(tenantId)) {
return false;
} else {
//根据租户判断是否可以查看
if (JdbcInfoEnum.PUBLIC.getTenantId().equals(tenantId)) {
//租户为 public的内容均可查看
return true;
}
return magicUser.getUsername().split("-")[0].equalsIgnoreCase(tenantId);
}
} else {
//保存 或 其他
return magicUser.getUsername().equals(createBy) || magicUser.getUsername().equals(updateBy);
}
}catch (Exception e){
e.printStackTrace();
return false;
}
}
private String getTenantId(String createBy, String updateBy){
if(!StringUtils.isEmpty(createBy)){
return createBy.split("-")[0];
}
if(!StringUtils.isEmpty(updateBy)){
return updateBy.split("-")[0];
}
return "";
}
private String getUserCodeAndUserName(String createBy, String updateBy){
try {
if (!StringUtils.isEmpty(createBy)) {
return createBy.split("-")[1];
}
if (!StringUtils.isEmpty(updateBy)) {
return updateBy.split("-")[1];
}
}catch (Exception e){
e.printStackTrace();
}
return "";
}
}