添加系统默认角色支持

This commit is contained in:
2023-11-12 20:13:12 +08:00
parent 35c8ab63ca
commit 0287c7e698
10 changed files with 96 additions and 23 deletions

View File

@@ -5,7 +5,6 @@ import cn.lihongjie.coal.common.Ctx;
import cn.lihongjie.coal.exception.BizException; import cn.lihongjie.coal.exception.BizException;
import cn.lihongjie.coal.resource.entity.ResourceEntity; import cn.lihongjie.coal.resource.entity.ResourceEntity;
import cn.lihongjie.coal.resource.service.ResourceService; import cn.lihongjie.coal.resource.service.ResourceService;
import cn.lihongjie.coal.role.entity.RoleEntity;
import cn.lihongjie.coal.role.service.RoleService; import cn.lihongjie.coal.role.service.RoleService;
import cn.lihongjie.coal.session.SessionService; import cn.lihongjie.coal.session.SessionService;
import cn.lihongjie.coal.spring.config.SystemConfig; import cn.lihongjie.coal.spring.config.SystemConfig;
@@ -21,7 +20,6 @@ import jakarta.servlet.http.HttpServletResponse;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.http.entity.ContentType; import org.apache.http.entity.ContentType;
import org.slf4j.MDC; import org.slf4j.MDC;
@@ -40,10 +38,8 @@ import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.pattern.PathPatternParser; import org.springframework.web.util.pattern.PathPatternParser;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
import java.util.Optional; import java.util.Optional;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.stream.Stream;
@Component @Component
@Order(0) @Order(0)
@@ -147,11 +143,7 @@ public class AuthFilter extends OncePerRequestFilter {
MDC.put("user", user.getUsername()); MDC.put("user", user.getUsername());
Optional<ResourceEntity> userResource = Optional<ResourceEntity> userResource =
Stream.concat( user.allRoles().stream()
ObjectUtils.defaultIfNull(
user.getRoles(), new ArrayList<RoleEntity>())
.stream(),
roleService.getDefaultRoles().stream())
.flatMap(x -> x.getPermissions().stream()) .flatMap(x -> x.getPermissions().stream())
.flatMap(x -> x.getResources().stream()) .flatMap(x -> x.getResources().stream())
.filter(x -> StringUtils.equals(x.getId(), resource.get().getId())) .filter(x -> StringUtils.equals(x.getId(), resource.get().getId()))

View File

@@ -9,7 +9,7 @@ import cn.lihongjie.coal.organization.dto.UpdateOrganizationDto;
import cn.lihongjie.coal.organization.entity.OrganizationEntity; import cn.lihongjie.coal.organization.entity.OrganizationEntity;
import cn.lihongjie.coal.organization.mapper.OrganizationMapper; import cn.lihongjie.coal.organization.mapper.OrganizationMapper;
import cn.lihongjie.coal.organization.repository.OrganizationRepository; import cn.lihongjie.coal.organization.repository.OrganizationRepository;
import cn.lihongjie.coal.user.dto.CreateUserDto; import cn.lihongjie.coal.user.dto.CreateOrgAdminDto;
import cn.lihongjie.coal.user.service.UserService; import cn.lihongjie.coal.user.service.UserService;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
@@ -43,11 +43,11 @@ public class OrganizationService extends BaseService<OrganizationEntity, Organiz
this.repository.save(entity); this.repository.save(entity);
CreateUserDto dto = new CreateUserDto(); CreateOrgAdminDto dto = new CreateOrgAdminDto();
dto.setOrganizationId(entity.getId()); dto.setOrganizationId(entity.getId());
dto.setUsername(request.getOrgAdminUserName()); dto.setUsername(request.getOrgAdminUserName());
dto.setPassword(request.getOrgAdminPassword()); dto.setPassword(request.getOrgAdminPassword());
userService.create(dto); userService.createOrgAdmin(dto);
return getById(entity.getId()); return getById(entity.getId());
} }

View File

@@ -23,6 +23,9 @@ public class RoleEntity extends OrgCommonEntity {
@Comment("是否为系统默认角色") @Comment("是否为系统默认角色")
private Boolean isSysDefault = false; private Boolean isSysDefault = false;
@Comment("是否为机构管理员默认角色")
private Boolean isOrgAdmin = false;
@ManyToMany(mappedBy = "roles") @ManyToMany(mappedBy = "roles")
@Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE) @Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE)
private List<UserEntity> users; private List<UserEntity> users;

View File

@@ -11,4 +11,6 @@ import java.util.List;
public interface RoleRepository extends BaseRepository<RoleEntity> { public interface RoleRepository extends BaseRepository<RoleEntity> {
List<RoleEntity> findAllByIsSysDefault(Boolean isSysDefault); List<RoleEntity> findAllByIsSysDefault(Boolean isSysDefault);
List<RoleEntity> findAllByIsOrgAdmin(Boolean isOrgAdmin);
} }

View File

@@ -77,8 +77,13 @@ public class RoleService extends BaseService<RoleEntity, RoleRepository> {
return page.map(this.mapper::toDto); return page.map(this.mapper::toDto);
} }
public List<RoleEntity> getDefaultRoles() { public List<RoleEntity> getSysDefaultRoles() {
return repository.findAllByIsSysDefault(true); return repository.findAllByIsSysDefault(true);
} }
public List<RoleEntity> getOrgAdminRoles() {
return repository.findAllByIsOrgAdmin(true);
}
} }

View File

@@ -0,0 +1,27 @@
package cn.lihongjie.coal.user.dto;
import cn.lihongjie.coal.base.dto.OrgCommonDto;
import lombok.Data;
import org.hibernate.annotations.Comment;
import java.util.List;
@Data
public class CreateOrgAdminDto extends OrgCommonDto {
@Comment("用户名")
private String username;
@Comment("密码")
private String password;
@Comment("邮箱")
private String email;
@Comment("手机号")
private String phone;
private List<String> roles;
}

View File

@@ -22,6 +22,7 @@ public class UserDto extends OrgCommonDto {
@Comment("会话ID") @Comment("会话ID")
private String sessionId; private String sessionId;
private List<RoleDto> roles; private List<RoleDto> roles;
private List<RoleDto> otherRoles;
@Data @Data
public static class RoleDto extends OrgCommonDto {} public static class RoleDto extends OrgCommonDto {}

View File

@@ -3,16 +3,14 @@ package cn.lihongjie.coal.user.entity;
import cn.lihongjie.coal.base.entity.OrgCommonEntity; import cn.lihongjie.coal.base.entity.OrgCommonEntity;
import cn.lihongjie.coal.role.entity.RoleEntity; import cn.lihongjie.coal.role.entity.RoleEntity;
import jakarta.persistence.Cacheable; import jakarta.persistence.*;
import jakarta.persistence.Entity;
import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToMany;
import lombok.Data; import lombok.Data;
import org.hibernate.annotations.Cache; import org.hibernate.annotations.Cache;
import org.hibernate.annotations.Comment; import org.hibernate.annotations.Comment;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Data @Data
@@ -45,9 +43,20 @@ public class UserEntity extends OrgCommonEntity {
@Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE) @Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE)
private List<RoleEntity> roles; private List<RoleEntity> roles;
@Transient private List<RoleEntity> otherRoles;
@Comment("机构管理员标识") @Comment("机构管理员标识")
private Boolean orgAdmin; private Boolean orgAdmin;
@Comment("系统管理员标识") @Comment("系统管理员标识")
private Boolean sysAdmin; private Boolean sysAdmin;
public List<RoleEntity> allRoles() {
List<RoleEntity> allRoles = new ArrayList<>(this.roles);
if (this.otherRoles != null) {
allRoles.addAll(this.otherRoles);
}
return allRoles;
}
} }

View File

@@ -2,6 +2,7 @@ package cn.lihongjie.coal.user.mapper;
import cn.lihongjie.coal.base.mapper.BaseMapper; import cn.lihongjie.coal.base.mapper.BaseMapper;
import cn.lihongjie.coal.base.mapper.CommonMapper; import cn.lihongjie.coal.base.mapper.CommonMapper;
import cn.lihongjie.coal.user.dto.CreateOrgAdminDto;
import cn.lihongjie.coal.user.dto.CreateUserDto; import cn.lihongjie.coal.user.dto.CreateUserDto;
import cn.lihongjie.coal.user.dto.UpdateUserDto; import cn.lihongjie.coal.user.dto.UpdateUserDto;
import cn.lihongjie.coal.user.dto.UserDto; import cn.lihongjie.coal.user.dto.UserDto;
@@ -15,4 +16,6 @@ import org.mapstruct.control.DeepClone;
componentModel = MappingConstants.ComponentModel.SPRING, componentModel = MappingConstants.ComponentModel.SPRING,
uses = {CommonMapper.class}, uses = {CommonMapper.class},
mappingControl = DeepClone.class) mappingControl = DeepClone.class)
public interface UserMapper extends BaseMapper<UserEntity, UserDto, CreateUserDto, UpdateUserDto> {} public interface UserMapper extends BaseMapper<UserEntity, UserDto, CreateUserDto, UpdateUserDto> {
UserEntity toEntity(CreateOrgAdminDto request);
}

View File

@@ -9,11 +9,9 @@ import cn.lihongjie.coal.organization.entity.OrganizationEntity;
import cn.lihongjie.coal.resource.dto.ResourceDto; import cn.lihongjie.coal.resource.dto.ResourceDto;
import cn.lihongjie.coal.resource.mapper.ResourceMapper; import cn.lihongjie.coal.resource.mapper.ResourceMapper;
import cn.lihongjie.coal.resource.service.ResourceService; import cn.lihongjie.coal.resource.service.ResourceService;
import cn.lihongjie.coal.role.entity.RoleEntity;
import cn.lihongjie.coal.role.service.RoleService; import cn.lihongjie.coal.role.service.RoleService;
import cn.lihongjie.coal.user.dto.ChangeUserPwdDto; import cn.lihongjie.coal.user.dto.*;
import cn.lihongjie.coal.user.dto.CreateUserDto;
import cn.lihongjie.coal.user.dto.UpdateUserDto;
import cn.lihongjie.coal.user.dto.UserDto;
import cn.lihongjie.coal.user.entity.UserEntity; import cn.lihongjie.coal.user.entity.UserEntity;
import cn.lihongjie.coal.user.mapper.UserMapper; import cn.lihongjie.coal.user.mapper.UserMapper;
import cn.lihongjie.coal.user.repository.UserRepository; import cn.lihongjie.coal.user.repository.UserRepository;
@@ -27,6 +25,7 @@ import jakarta.persistence.criteria.Root;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.ConversionService;
@@ -84,6 +83,30 @@ public class UserService extends BaseService<UserEntity, UserRepository> {
} }
} }
public UserDto createOrgAdmin(CreateOrgAdminDto request) {
StopWatch stopWatch = new StopWatch();
try {
stopWatch.start("encode");
request.setPassword(passwordEncoder.encode(request.getPassword()));
stopWatch.stop();
UserEntity entity = mapper.toEntity(request);
entity.setOrgAdmin(true);
entity.setSysAdmin(false);
stopWatch.start("save");
this.repository.save(entity);
stopWatch.stop();
stopWatch.start("getById");
return getById(entity.getId());
} finally {
stopWatch.stop();
log.info(stopWatch.prettyPrint());
}
}
public UserDto update(UpdateUserDto request) { public UserDto update(UpdateUserDto request) {
UserEntity user = this.repository.get(request.getId()); UserEntity user = this.repository.get(request.getId());
this.mapper.updateEntity(user, request); this.mapper.updateEntity(user, request);
@@ -100,6 +123,14 @@ public class UserService extends BaseService<UserEntity, UserRepository> {
UserEntity user = repository.get(id); UserEntity user = repository.get(id);
List<RoleEntity> defaultRoles = roleService.getSysDefaultRoles();
user.setOtherRoles(defaultRoles);
if (BooleanUtils.isTrue(user.getOrgAdmin())) {
List<RoleEntity> orgAdminRoles = roleService.getOrgAdminRoles();
user.getOtherRoles().addAll(orgAdminRoles);
}
UserDto dto = mapper.toDto(user); UserDto dto = mapper.toDto(user);
if (Ctx.isLoggedIn()) { if (Ctx.isLoggedIn()) {
dto.setSessionId(Ctx.getSessionId()); dto.setSessionId(Ctx.getSessionId());
@@ -199,7 +230,7 @@ public class UserService extends BaseService<UserEntity, UserRepository> {
if (CollectionUtils.isEmpty(user.getRoles())) { if (CollectionUtils.isEmpty(user.getRoles())) {
return new ArrayList<>(); return new ArrayList<>();
} }
return io.vavr.collection.Stream.ofAll(user.getRoles()) return io.vavr.collection.Stream.ofAll(user.allRoles())
.flatMap( .flatMap(
x -> x ->
x.getPermissions() == null x.getPermissions() == null