feat(user): 完善用户注册时的角色分配机制

- 在邀请注册流程中支持传递roleId参数
- 实现角色分配逻辑:优先使用传入的roleId,其次使用roleCode,默认为"user"
- 添加租户验证确保角色属于当前租户
- 修复缺失默认角色时的创建机制
- 确保注册响应中包含用户的角色和权限信息
This commit is contained in:
2026-01-27 17:38:28 +08:00
parent b2b6b1306f
commit d63df710b3
2 changed files with 38 additions and 15 deletions

View File

@@ -654,6 +654,8 @@ public class MainController extends BaseController {
userParam.setUsername(username);
userParam.setNickname(DesensitizedUtil.mobilePhone(phone));
userParam.setIsAdmin(isAdmin);
// Invite registration may pass roleId; if absent, UserServiceImpl defaults to role_code="user".
userParam.setRoleId(user.getRoleId());
if (user.getTemplateId() != null) {
userParam.setTemplateId(user.getTemplateId());
}
@@ -800,6 +802,8 @@ public class MainController extends BaseController {
final UserParam userParam = new UserParam();
userParam.setPhone(phone);
userParam.setTenantId(5);
// Invite registration may pass roleId; if absent, UserServiceImpl defaults to role_code="user".
userParam.setRoleId(user.getRoleId());
if(user.getIndustryParent() != null){
userParam.setIndustryParent(user.getIndustryParent());
userParam.setIndustryChild(user.getIndustryChild());

View File

@@ -276,24 +276,40 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
}
addUser.setTenantId(userParam.getTenantId());
addUser.setRecommend(0);
// Pick the default "user" role for the tenant. If it doesn't exist (fresh DB / incomplete init),
// create it to avoid NPE during registration/login.
QueryWrapper<Role> roleQw = new QueryWrapper<Role>().eq("role_code", "admin");
if (addUser.getTenantId() != null) {
roleQw.eq("tenant_id", addUser.getTenantId());
// Role assignment:
// - If roleId is provided (e.g. invite flow), use it (must belong to the same tenant).
// - Otherwise, fall back to roleCode; default to "user".
Role role = null;
if (userParam.getRoleId() != null) {
role = roleService.getById(userParam.getRoleId());
if (role != null
&& addUser.getTenantId() != null
&& role.getTenantId() != null
&& !addUser.getTenantId().equals(role.getTenantId())) {
throw new BusinessException("角色不属于当前租户");
}
}
Role role = roleService.getOne(roleQw, false);
if (role == null && addUser.getTenantId() != null) {
Role defaultRole = new Role();
defaultRole.setRoleName("注册用户");
defaultRole.setRoleCode("user");
defaultRole.setComments("普通注册用户");
defaultRole.setTenantId(addUser.getTenantId());
roleService.save(defaultRole);
role = defaultRole;
String roleCode = userParam.getRoleCode();
if (role == null) {
roleCode = StrUtil.blankToDefault(roleCode, "user");
QueryWrapper<Role> roleQw = new QueryWrapper<Role>().eq("role_code", roleCode);
if (addUser.getTenantId() != null) {
roleQw.eq("tenant_id", addUser.getTenantId());
}
role = roleService.getOne(roleQw, false);
// If the default "user" role is missing (fresh DB / incomplete init), create it to avoid empty roles.
if (role == null && addUser.getTenantId() != null && "user".equals(roleCode)) {
Role defaultRole = new Role();
defaultRole.setRoleName("注册用户");
defaultRole.setRoleCode("user");
defaultRole.setComments("普通注册用户");
defaultRole.setTenantId(addUser.getTenantId());
roleService.save(defaultRole);
role = defaultRole;
}
}
if (role == null) {
throw new BusinessException("缺少默认角色(role_code=user),请先初始化角色");
throw new BusinessException("缺少默认角色(role_code=" + (roleCode == null ? "user" : roleCode) + "),请先初始化角色");
}
addUser.setRoleId(role.getRoleId());
if (saveUser(addUser)) {
@@ -304,6 +320,9 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
userRole.setRoleId(addUser.getRoleId());
userRoleService.save(userRole);
}
// Ensure caller (e.g. register / invite register) gets non-empty roles/authorities in response.
addUser.setRoles(userRoleService.listByUserId(addUser.getUserId()));
addUser.setAuthorities(roleMenuService.listMenuByUserId(addUser.getUserId(), null));
return addUser;
}