feat: [auth] global admins

This commit is contained in:
tjq 2024-02-16 13:28:58 +08:00
parent 686189e6ca
commit 7b7582dd91
6 changed files with 46 additions and 33 deletions

View File

@ -1,25 +1,24 @@
package tech.powerjob.server.web.controller;
import com.google.common.collect.Maps;
import org.springframework.web.bind.annotation.*;
import tech.powerjob.common.response.ResultDTO;
import tech.powerjob.common.serialize.JsonUtils;
import tech.powerjob.server.auth.*;
import tech.powerjob.common.utils.CollectionUtils;
import tech.powerjob.server.auth.Permission;
import tech.powerjob.server.auth.PowerJobUser;
import tech.powerjob.server.auth.RoleScope;
import tech.powerjob.server.auth.common.AuthConstants;
import tech.powerjob.server.auth.interceptor.ApiPermission;
import tech.powerjob.server.auth.login.LoginTypeInfo;
import tech.powerjob.server.auth.service.WebAuthService;
import tech.powerjob.server.auth.service.login.LoginRequest;
import tech.powerjob.server.auth.service.login.PowerJobLoginService;
import tech.powerjob.server.auth.service.permission.PowerJobPermissionService;
import tech.powerjob.server.web.request.GrantPermissionRequest;
import tech.powerjob.server.web.request.ComponentUserRoleInfo;
import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
/**
@ -33,9 +32,9 @@ import java.util.Optional;
public class AuthController {
@Resource
private PowerJobLoginService powerJobLoginService;
private WebAuthService webAuthService;
@Resource
private PowerJobPermissionService powerJobPermissionService;
private PowerJobLoginService powerJobLoginService;
@GetMapping("/supportLoginTypes")
public ResultDTO<List<LoginTypeInfo>> listSupportLoginTypes() {
@ -97,31 +96,25 @@ public class AuthController {
}
/* ****************** 授权相关 ****************** */
@PostMapping("/grantAdmin")
@ApiPermission(name = "Auth-GrantAdmin", roleScope = RoleScope.GLOBAL, requiredPermission = Permission.SU)
public ResultDTO<Void> grantAppPermission(GrantPermissionRequest grantPermissionRequest) {
grantPermissionRequest.setRole(Role.ADMIN.getV());
grantPermissionRequest.setTargetId(AuthConstants.GLOBAL_ADMIN_TARGET_ID);
grantPermission(RoleScope.GLOBAL, grantPermissionRequest);
return ResultDTO.success(null);
@GetMapping("/listGlobalAdmin")
public ResultDTO<List<Long>> listGlobalAdmin() {
// 全局只设置超级管理员权限
ComponentUserRoleInfo componentUserRoleInfo = webAuthService.fetchComponentUserRoleInfo(RoleScope.GLOBAL, AuthConstants.GLOBAL_ADMIN_TARGET_ID);
return ResultDTO.success(componentUserRoleInfo.getAdmin());
}
@PostMapping("/saveGlobalAdmin")
@ApiPermission(name = "Auth-GrantAdmin", roleScope = RoleScope.GLOBAL, requiredPermission = Permission.SU)
public ResultDTO<Void> grantAppPermission(@RequestBody ComponentUserRoleInfo componentUserRoleInfo) {
private void grantPermission(RoleScope roleScope, GrantPermissionRequest grantPermissionRequest) {
if (CollectionUtils.isEmpty(componentUserRoleInfo.getAdmin())) {
throw new IllegalArgumentException("At least one super administrator is required!");
}
Role role = Role.of(grantPermissionRequest.getRole());
Optional.ofNullable(grantPermissionRequest.getUserIds()).orElse(Collections.emptyList()).forEach(uid -> {
// 记录授权人信息
Map<String, Object> extraInfo = Maps.newHashMap();
extraInfo.put("grantor", LoginUserHolder.getUserName());
String extra = JsonUtils.toJSONString(extraInfo);
powerJobPermissionService.grantRole(roleScope, grantPermissionRequest.getTargetId(), uid, role, extra);
});
webAuthService.processPermissionOnSave(RoleScope.GLOBAL, AuthConstants.GLOBAL_ADMIN_TARGET_ID, componentUserRoleInfo);
return ResultDTO.success(null);
}
private void fillJwt4LoginUser(PowerJobUser powerJobUser, HttpServletResponse httpServletResponse) {

View File

@ -83,7 +83,7 @@ public class NamespaceController {
nv.setId(nd.getId());
nv.setCode(nd.getCode());
nv.setName(nd.getName());
nv.genFrontName();
nv.genShowName();
return nv;
}).collect(Collectors.toList());
return ResultDTO.success(namespaceBaseVOList);

View File

@ -124,6 +124,7 @@ public class UserInfoController {
}
UserDetailVO userDetailVO = new UserDetailVO();
BeanUtils.copyProperties(userinfoDoOpt.get(), userDetailVO);
userDetailVO.genShowName();
// 权限信息
Map<Role, List<Long>> globalPermissions = webAuthService.fetchMyPermissionTargets(RoleScope.GLOBAL);
@ -144,7 +145,7 @@ public class UserInfoController {
}
NamespaceBaseVO namespaceBaseVO = JsonUtils.parseObjectIgnoreException(JsonUtils.toJSONString(NamespaceConverter.do2BaseVo(namespaceDO)), NamespaceBaseVO.class);
if (namespaceBaseVO != null) {
namespaceBaseVO.genFrontName();
namespaceBaseVO.genShowName();
namespaceBaseVOS.add(namespaceBaseVO);
}
});

View File

@ -12,10 +12,14 @@ import tech.powerjob.server.web.response.UserBaseVO;
public class UserConverter {
public static UserBaseVO do2BaseVo(UserInfoDO x) {
UserBaseVO userBaseVO = new UserBaseVO();
userBaseVO.setId(x.getId());
userBaseVO.setUsername(x.getUsername());
userBaseVO.setNick(x.getNick());
userBaseVO.genShowName();
return userBaseVO;
}

View File

@ -30,9 +30,9 @@ public class NamespaceBaseVO implements Serializable {
/**
* 前端名称拼接 code + name更容易辨认
*/
protected String frontName;
protected String showName;
public void genFrontName() {
frontName = String.format("%s(%s)", name, code);
public void genShowName() {
showName = String.format("%s(%s)", name, code);
}
}

View File

@ -3,6 +3,7 @@ package tech.powerjob.server.web.response;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
/**
* 用户基础信息
@ -17,4 +18,18 @@ public class UserBaseVO {
protected Long id;
protected String username;
protected String nick;
/**
* 前端展示名称更容易辨认
*/
protected String showName;
public void genShowName() {
if (StringUtils.isEmpty(nick)) {
showName = username;
} else {
showName = String.format("%s (%s)", nick, username);
}
}
}