de/backend/src/main/java/io/dataease/plugins/server/XAuthServer.java
2022-07-28 11:09:05 +08:00

174 lines
7.7 KiB
Java

package io.dataease.plugins.server;
import io.dataease.auth.api.dto.CurrentUserDto;
import io.dataease.commons.constants.AuthConstants;
import io.dataease.commons.constants.SysLogConstants;
import io.dataease.commons.utils.AuthUtils;
import io.dataease.commons.utils.DeLogUtils;
import io.dataease.controller.handler.annotation.I18n;
import io.dataease.dto.SysLogDTO;
import io.dataease.listener.util.CacheUtils;
import io.dataease.plugins.common.dto.DatasourceBaseType;
import io.dataease.plugins.common.dto.datasource.DataSourceType;
import io.dataease.plugins.config.SpringContextUtil;
import io.dataease.plugins.xpack.auth.dto.request.XpackBaseTreeRequest;
import io.dataease.plugins.xpack.auth.dto.request.XpackSysAuthRequest;
import io.dataease.plugins.xpack.auth.dto.response.XpackSysAuthDetail;
import io.dataease.plugins.xpack.auth.dto.response.XpackSysAuthDetailDTO;
import io.dataease.plugins.xpack.auth.dto.response.XpackVAuthModelDTO;
import io.dataease.service.datasource.DatasourceService;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.*;
import io.dataease.plugins.xpack.auth.service.AuthXpackService;
import springfox.documentation.annotations.ApiIgnore;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
@ApiIgnore
@RequestMapping("/plugin/auth")
@RestController
public class XAuthServer {
private static final Set<String> cacheTypes = new HashSet<>();
@Resource
private DatasourceService datasourceService;
@RequiresPermissions("auth:read")
@PostMapping("/authModels")
@I18n
public List<XpackVAuthModelDTO> authModels(@RequestBody XpackBaseTreeRequest request) {
AuthXpackService sysAuthService = SpringContextUtil.getBean(AuthXpackService.class);
CurrentUserDto user = AuthUtils.getUser();
return sysAuthService.searchAuthModelTree(request, user.getUserId(), user.getIsAdmin());
}
@RequiresPermissions("auth:read")
@PostMapping("/authDetails")
public Map<String, List<XpackSysAuthDetailDTO>> authDetails(@RequestBody XpackSysAuthRequest request) {
AuthXpackService sysAuthService = SpringContextUtil.getBean(AuthXpackService.class);
return sysAuthService.searchAuthDetails(request);
}
@RequiresPermissions("auth:read")
@GetMapping("/authDetailsModel/{authType}/{direction}")
@I18n
public List<XpackSysAuthDetail> authDetailsModel(@PathVariable String authType, @PathVariable String direction) {
AuthXpackService sysAuthService = SpringContextUtil.getBean(AuthXpackService.class);
List<XpackSysAuthDetail> authDetails = sysAuthService.searchAuthDetailsModel(authType);
if (authType.equalsIgnoreCase("dataset")) {
XpackSysAuthDetail xpackSysAuthDetail = new XpackSysAuthDetail();
xpackSysAuthDetail.setPrivilegeName("i18n_auth_row_permission");
xpackSysAuthDetail.setPrivilegeType(20);
xpackSysAuthDetail.setPrivilegeValue(1);
authDetails.add(0, xpackSysAuthDetail);
}
return authDetails;
}
@RequiresPermissions("auth:read")
@PostMapping("/authChange")
public void authChange(@RequestBody XpackSysAuthRequest request) {
AuthXpackService sysAuthService = SpringContextUtil.getBean(AuthXpackService.class);
CurrentUserDto user = AuthUtils.getUser();
sysAuthService.authChange(request, user.getUserId(), user.getUsername(), user.getIsAdmin());
// 当权限发生变化 前端实时刷新对应菜单
Optional.ofNullable(request.getAuthSourceType()).ifPresent(type -> {
if (StringUtils.equals("menu", type)) {
CacheUtils.removeAll(AuthConstants.USER_CACHE_NAME);
CacheUtils.removeAll(AuthConstants.USER_ROLE_CACHE_NAME);
CacheUtils.removeAll(AuthConstants.USER_PERMISSION_CACHE_NAME);
}
String authCacheKey = getAuthCacheKey(request);
if (StringUtils.isNotBlank(authCacheKey)) {
if (StringUtils.equals("dept", request.getAuthTargetType())) {
List<String> authTargets = AuthUtils.getAuthModels(request.getAuthTarget(), request.getAuthTargetType(),
user.getUserId(), user.getIsAdmin());
if (CollectionUtils.isNotEmpty(authTargets)) {
authTargets.forEach(deptId -> {
CacheUtils.remove(authCacheKey, request.getAuthTargetType() + deptId);
});
}
} else {
CacheUtils.remove(authCacheKey, request.getAuthTargetType() + request.getAuthTarget());
}
}
SysLogConstants.OPERATE_TYPE operateType = SysLogConstants.OPERATE_TYPE.AUTHORIZE;
if (1 == request.getAuthDetail().getPrivilegeValue()) {
operateType = SysLogConstants.OPERATE_TYPE.UNAUTHORIZE;
}
SysLogConstants.SOURCE_TYPE sourceType = sourceType(request.getAuthSourceType());
SysLogConstants.SOURCE_TYPE tarType = tarType(request.getAuthTargetType());
SysLogDTO sysLogDTO = DeLogUtils.buildLog(operateType, sourceType, request.getAuthSource(), request.getAuthTarget(), tarType);
DeLogUtils.save(sysLogDTO);
});
}
private SysLogConstants.SOURCE_TYPE sourceType(String sourceType) {
if (StringUtils.equals("link", sourceType)) {
return SysLogConstants.SOURCE_TYPE.DATASOURCE;
}
if (StringUtils.equals("menu", sourceType)) {
return SysLogConstants.SOURCE_TYPE.MENU;
}
if (StringUtils.equals("dataset", sourceType)) {
return SysLogConstants.SOURCE_TYPE.DATASET;
}
if (StringUtils.equals("panel", sourceType)) {
return SysLogConstants.SOURCE_TYPE.PANEL;
}
return null;
}
private SysLogConstants.SOURCE_TYPE tarType(String targetType) {
if (StringUtils.equals("user", targetType)) {
return SysLogConstants.SOURCE_TYPE.USER;
}
if (StringUtils.equals("role", targetType)) {
return SysLogConstants.SOURCE_TYPE.ROLE;
}
if (StringUtils.equals("dept", targetType)) {
return SysLogConstants.SOURCE_TYPE.DEPT;
}
return null;
}
private String getAuthCacheKey(XpackSysAuthRequest request) {
if (CollectionUtils.isEmpty(cacheTypes)) {
cacheTypes.add("link");
cacheTypes.add("dataset");
cacheTypes.add("panel");
}
String authTargetType = request.getAuthTargetType();
String authSourceType = request.getAuthSourceType();
if (!cacheTypes.contains(authSourceType)) {
return null;
}
return authTargetType + "_" + authSourceType;
}
@GetMapping("/getDatasourceTypes")
public List<DatasourceBaseType> getDatasourceTypes(){
Collection<DataSourceType> activeType = datasourceService.types();
Map<String,String> activeTypeMap = activeType.stream().collect(Collectors.toMap(DataSourceType::getType, DataSourceType::getName));
activeTypeMap.put("all","所有数据源");
AuthXpackService sysAuthService = SpringContextUtil.getBean(AuthXpackService.class);
List<DatasourceBaseType> presentTypes = sysAuthService.getDatasourceTypes();
presentTypes.stream().forEach(datasourceBaseType -> {
if(activeTypeMap.get(datasourceBaseType.getType())!=null){
datasourceBaseType.setName(activeTypeMap.get(datasourceBaseType.getType()));
}
});
return presentTypes;
}
}