feat(user): 完善用户注册时的角色分配机制
- 在邀请注册流程中支持传递roleId参数 - 实现角色分配逻辑:优先使用传入的roleId,其次使用roleCode,默认为"user" - 添加租户验证确保角色属于当前租户 - 修复缺失默认角色时的创建机制 - 确保注册响应中包含用户的角色和权限信息
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user