当前位置:   article > 正文

Asp.Net Core 7.0 基于JWT组织用户角色权限认证(二)_net core jwt 角色、权限设计

net core jwt 角色、权限设计

前言:

上一篇我们已经完成了权限校验以及授权的部分,本篇接下来我们分析一下如何基于组织用户角色进行权限管理

在本项目中,支持建立多组织,同一用户支持在不同组织下授予不同的角色。由于本人是新人,如果有好的见解或者看法欢迎和我沟通,互相学习进步。

数据库表:

数据库:MYSQL,使用EF-CORE基于仓储模式来进行数据库管理。
该项目管理表之间的关联关系主要是用第三张表来管理,相对来说比较好理解。
结构:

Entity 实体结构:

Manager模块(核心逻辑):

1. PermissionManager
  1. using AutoMapper;
  2. using Microsoft.Extensions.Logging;
  3. using Newtonsoft.Json;
  4. using org.huage.AuthManagement.BizManager.Redis;
  5. using org.huage.AuthManagement.BizManager.wrapper;
  6. using org.huage.AuthManagement.DataBase.Table;
  7. using org.huage.AuthManagement.Entity.Managers;
  8. using org.huage.AuthManagement.Entity.Model;
  9. using org.huage.AuthManagement.Entity.Request;
  10. using org.huage.AuthManagement.Entity.Response;
  11. namespace org.huage.AuthManagement.BizManager.Manager;
  12. //权限管理
  13. public class PermissionManager : IPermissionManager
  14. {
  15. private readonly IRepositoryWrapper _wrapper;
  16. private readonly IRedisManager _redisManager;
  17. private readonly ILogger<PermissionManager> _logger;
  18. private readonly IMapper _mapper;
  19. public PermissionManager(IRepositoryWrapper wrapper, IRedisManager redisManager, ILogger<PermissionManager> logger, IMapper mapper)
  20. {
  21. _wrapper = wrapper;
  22. _redisManager = redisManager;
  23. _logger = logger;
  24. _mapper = mapper;
  25. }
  26. /// <summary>
  27. /// 查询所有的权限信息。
  28. /// </summary>
  29. /// <returns></returns>
  30. public async Task<QueryAllPermissionResponse> QueryAllPermissionAsync()
  31. {
  32. var response = new QueryAllPermissionResponse();
  33. try
  34. {
  35. //查询缓存
  36. var permissionModels = await _redisManager.HGetAllValue<PermissionModel>(RedisKeyGenerator.AllRolesRedisKey());
  37. if (permissionModels.Any())
  38. {
  39. response.PermissionModels = permissionModels;
  40. return response;
  41. }
  42. //查询数据库
  43. var permissions = _wrapper.Permission.FindAll().Where(_ => _.IsDeleted == false).ToList();
  44. var data = _mapper.Map<List<PermissionModel>>(permissions);
  45. response.PermissionModels = data;
  46. var permissionsDic = data.ToDictionary(_ => _.Id);
  47. //添加缓存
  48. await permissionsDic.ParallelForEachAsync(async permission =>
  49. {
  50. var redisKey = RedisKeyGenerator.AllPermissions();
  51. try
  52. {
  53. foreach (var s in data)
  54. {
  55. await _redisManager.HashSet(redisKey, permission.Key.ToString(),
  56. JsonConvert.SerializeObject(permission.Value));
  57. }
  58. }
  59. catch (Exception e)
  60. {
  61. _logger.LogError(e.Message);
  62. }
  63. });
  64. }
  65. catch (Exception e)
  66. {
  67. _logger.LogError($"QueryAllPermissionAsync error: {e.Message}");
  68. throw;
  69. }
  70. return response;
  71. }
  72. /// <summary>
  73. /// 添加权限
  74. /// </summary>
  75. /// <param name="request"></param>
  76. public async Task AddPermissionAsync(AddPermissionRequest request)
  77. {
  78. var permission = _mapper.Map<Permission>(request);
  79. _wrapper.Permission.Create(permission);
  80. await _wrapper.SaveChangeAsync();
  81. }
  82. }
2. RoleManager
  1. using AutoMapper;
  2. using Microsoft.EntityFrameworkCore;
  3. using Microsoft.Extensions.Logging;
  4. using Newtonsoft.Json;
  5. using org.huage.AuthManagement.BizManager.Redis;
  6. using org.huage.AuthManagement.BizManager.wrapper;
  7. using org.huage.AuthManagement.DataBase.Table;
  8. using org.huage.AuthManagement.Entity.Managers;
  9. using org.huage.AuthManagement.Entity.Model;
  10. using org.huage.AuthManagement.Entity.Request;
  11. using org.huage.AuthManagement.Entity.Response;
  12. namespace org.huage.AuthManagement.BizManager.Manager;
  13. //角色管理
  14. public class RoleManager : IRoleManager
  15. {
  16. private readonly IRepositoryWrapper _wrapper;
  17. private readonly IRedisManager _redisManager;
  18. private readonly ILogger<RoleManager> _logger;
  19. private readonly IMapper _mapper;
  20. public RoleManager(IRedisManager redisManager, ILogger<RoleManager> logger, IMapper mapper,
  21. IRepositoryWrapper wrapper)
  22. {
  23. _redisManager = redisManager;
  24. _logger = logger;
  25. _mapper = mapper;
  26. _wrapper = wrapper;
  27. }
  28. /// <summary>
  29. /// 查询指定页的数据
  30. /// </summary>
  31. /// <param name="request"></param>
  32. /// <returns></returns>
  33. public async Task<List<RoleModel>> QueryRoleByPageAsync(QueryRoleRequest request)
  34. {
  35. //考虑分页
  36. //参数校验,设置错误,返回第一页
  37. if (request.PageSize <=0 || request.PageNumber<0)
  38. {
  39. request.PageNumber = 1;
  40. request.PageSize = 10;
  41. }
  42. //查询数据库,TODO:后面需要考虑查询的页数是否超过最大页数
  43. var skip = (request.PageNumber - 1) * request.PageSize;
  44. var schedulers =await _wrapper.Role.FindAll().Where(_ => _.IsDeleted == false).OrderByDescending(_ => _.CreateTime)
  45. .Skip(skip).Take(request.PageSize).ToListAsync();
  46. return _mapper.Map<List<RoleModel>>(schedulers);
  47. }
  48. /// <summary>
  49. /// 查询所有的角色
  50. /// </summary>
  51. /// <returns></returns>
  52. public async Task<QueryAllRolesResponse> QueryAllRolesAsync(QueryAllRolesRequest request)
  53. {
  54. var response = new QueryAllRolesResponse();
  55. try
  56. {
  57. //查询缓存
  58. var allSchedulers = await _redisManager.HGetAllValue<RoleModel>(RedisKeyGenerator.AllRolesRedisKey());
  59. if (allSchedulers.Any())
  60. {
  61. response.RoleModels = allSchedulers;
  62. return response;
  63. }
  64. //查询数据库
  65. var roles = _wrapper.Role.FindAll().Where(_ => _.IsDeleted == false).ToList();
  66. var data = _mapper.Map<List<RoleModel>>(roles);
  67. response.RoleModels = data;
  68. var rolesDic = data.ToDictionary(_ => _.Id);
  69. //添加缓存
  70. await rolesDic.ParallelForEachAsync(async role =>
  71. {
  72. var redisKey = RedisKeyGenerator.AllRolesRedisKey();
  73. try
  74. {
  75. foreach (var s in data)
  76. {
  77. await _redisManager.HashSet(redisKey, role.Key.ToString(),
  78. JsonConvert.SerializeObject(role.Value));
  79. }
  80. }
  81. catch (Exception e)
  82. {
  83. _logger.LogError(e.Message);
  84. }
  85. });
  86. }
  87. catch (Exception e)
  88. {
  89. _logger.LogError($"QueryAllRolesAsync error: {e.Message}");
  90. throw;
  91. }
  92. return response;
  93. }
  94. /// <summary>
  95. /// 查询角色的权限
  96. /// </summary>
  97. /// <param name="roleId"></param>
  98. /// <returns></returns>
  99. public async Task<QueryPermissionByRoleIdResponse> QueryPermissionByRoleIdAsync(int roleId)
  100. {
  101. var response = new QueryPermissionByRoleIdResponse();
  102. //查询权限ids
  103. var permissionIds = await _wrapper.RolePermission
  104. .FindByCondition(_ => _.RoleId == roleId && _.IsDeleted == false)
  105. .Select(_ => _.PermissionId).ToListAsync();
  106. if (permissionIds.Any())
  107. {
  108. foreach (var id in permissionIds)
  109. {
  110. var permission = _wrapper.Permission.FindByCondition(_ => _.Id == id && _.IsDeleted == false)
  111. .FirstOrDefault();
  112. var permissionModel = _mapper.Map<PermissionModel>(permission);
  113. response.PermissionModels.Add(permissionModel);
  114. }
  115. }
  116. return response;
  117. }
  118. /// <summary>
  119. /// 新增角色
  120. /// </summary>
  121. /// <param name="request"></param>
  122. public async Task AddRoleAsync(AddRoleRequest request)
  123. {
  124. //开启事务
  125. await using var transaction = await _wrapper.StartTransactionAsync();
  126. try
  127. {
  128. if (request.RoleIds.Any())
  129. {
  130. //插入角色
  131. var role = new Role()
  132. {
  133. Name = request.Name,
  134. CreateBy= request.CreateBy
  135. };
  136. _wrapper.Role.Create(role);
  137. //这里提前保存是为了拿到数据库中该对象的id.
  138. await _wrapper.SaveChangeAsync();
  139. //先插rolePermission表
  140. foreach (var p in request.RoleIds)
  141. {
  142. var rolePermission = new RolePermission()
  143. {
  144. RoleId = role.Id,
  145. PermissionId = p
  146. };
  147. _wrapper.RolePermission.Create(rolePermission);
  148. }
  149. }
  150. else
  151. {
  152. var role = _mapper.Map<Role>(request);
  153. _wrapper.Role.Create(role);
  154. }
  155. await _wrapper.SaveChangeAsync();
  156. await transaction.CommitAsync();
  157. }
  158. catch (Exception e)
  159. {
  160. await transaction.RollbackAsync();
  161. _logger.LogError("AddRoleAsync error.");
  162. throw;
  163. }
  164. }
  165. }
3. UserManager
  1. using AutoMapper;
  2. using Microsoft.EntityFrameworkCore;
  3. using Microsoft.Extensions.Logging;
  4. using Newtonsoft.Json;
  5. using org.huage.AuthManagement.BizManager.Helper;
  6. using org.huage.AuthManagement.BizManager.Redis;
  7. using org.huage.AuthManagement.BizManager.wrapper;
  8. using org.huage.AuthManagement.DataBase.Table;
  9. using org.huage.AuthManagement.Entity.Common;
  10. using org.huage.AuthManagement.Entity.Managers;
  11. using org.huage.AuthManagement.Entity.Model;
  12. using org.huage.AuthManagement.Entity.Request;
  13. using org.huage.AuthManagement.Entity.Response;
  14. namespace org.huage.AuthManagement.BizManager.Manager;
  15. //用户管理
  16. public class UserManager : IUserManager
  17. {
  18. private readonly IRepositoryWrapper _wrapper;
  19. private readonly IRedisManager _redisManager;
  20. private readonly ILogger<UserManager> _logger;
  21. private readonly IMapper _mapper;
  22. public UserManager(IMapper mapper, ILogger<UserManager> logger, IRedisManager redisManager, IRepositoryWrapper wrapper)
  23. {
  24. _mapper = mapper;
  25. _logger = logger;
  26. _redisManager = redisManager;
  27. _wrapper = wrapper;
  28. }
  29. /// <summary>
  30. /// 根据id查询用户
  31. /// </summary>
  32. /// <param name="id"></param>
  33. /// <returns></returns>
  34. public async Task<UserModel> QueryUserById(int id)
  35. {
  36. var user = _wrapper.User.FindByCondition(_=>_.Id==id).FirstOrDefault();
  37. if (user is null)
  38. return null;
  39. var userModel = _mapper.Map<UserModel>(user);
  40. return userModel;
  41. }
  42. /// <summary>
  43. /// 根据手机号查询用户
  44. /// </summary>
  45. /// <param name="phone"></param>
  46. /// <returns></returns>
  47. public async Task<UserModel> QueryUserByPhone(string phone)
  48. {
  49. var user = _wrapper.User.FindByCondition(_=>_.Phone == phone).FirstOrDefault();
  50. if (user is null)
  51. return null;
  52. var userModel = _mapper.Map<UserModel>(user);
  53. return userModel;
  54. }
  55. /// <summary>
  56. /// 新增用户,用户至少归属于一个组织
  57. /// </summary>
  58. /// <param name="request"></param>
  59. /// <exception cref="Exception"></exception>
  60. public async Task<UserModel> AddUserAsync(int organizationId, AddUserRequest request)
  61. {
  62. try
  63. {
  64. if (string.IsNullOrEmpty(request.UserName) || string.IsNullOrEmpty(request.PassWord))
  65. throw new UserException("Account and pwd is must.");
  66. if (string.IsNullOrEmpty(request.Phone))
  67. throw new UserException("Phone & OrgCode is required");
  68. //密码加密
  69. request.PassWord = PwdBCrypt.Encryption(request.PassWord);
  70. //判断用户表是否存在该用户
  71. var existOrNot = _wrapper.User.FindByCondition(_ => _.Phone.Equals(request.Phone )&& _.UserName.Equals(request.UserName))
  72. .FirstOrDefault();
  73. if (existOrNot is not null)
  74. {
  75. //判断关联表是否存在该用户
  76. var organizationUser = _wrapper.OrganizationUser
  77. .FindByCondition(_ => _.UserId == existOrNot.Id && _.OrganizationId == organizationId)
  78. .FirstOrDefault();
  79. if (organizationUser is not null)
  80. {
  81. //说明该用户已经存在
  82. throw new UserException("该用户已存在");
  83. }
  84. }
  85. //删除缓存
  86. await _redisManager.DelKey(RedisKeyGenerator.AllUsersRedisKey());
  87. var user = _mapper.Map<User>(request);
  88. _wrapper.User.Create(user);
  89. await _wrapper.SaveChangeAsync();
  90. //
  91. await _redisManager.DelKey(RedisKeyGenerator.AllUsersRedisKey());
  92. var userModel = _mapper.Map<UserModel>(user);
  93. return userModel;
  94. }
  95. catch (Exception _)
  96. {
  97. _logger.LogError($"Excuse AddUserAsync error: {_.Message}");
  98. throw;
  99. }
  100. }
  101. /// <summary>
  102. /// 更新用户信息
  103. /// </summary>
  104. /// <param name="request"></param>
  105. public async Task UpdateUserAsync(UpdateUserRequest request)
  106. {
  107. var user = _wrapper.User.FindByCondition(_ => _.Phone == request.Phone && _.IsDeleted == false).FirstOrDefault();
  108. if (user is null)
  109. {
  110. //user not exist
  111. return;
  112. }
  113. if (! string.IsNullOrEmpty(request.PassWord))
  114. {
  115. request.PassWord = PwdBCrypt.Encryption(request.PassWord);
  116. }
  117. if (string.Equals(user.UserName,request.UserName) && string.Equals(user.PassWord,request.PassWord) && string.Equals(user.Phone,request.Phone) && string.Equals(user.Remark,request.Remark))
  118. {
  119. //data not change
  120. return;
  121. }
  122. //set value
  123. if (!string.IsNullOrEmpty(request.UserName))
  124. {
  125. user.UserName = request.UserName;
  126. }
  127. if (!string.IsNullOrEmpty(request.PassWord))
  128. {
  129. user.PassWord = request.PassWord;
  130. }
  131. if (!string.IsNullOrEmpty(request.Phone))
  132. {
  133. user.Phone = request.Phone;
  134. }
  135. if (!string.IsNullOrEmpty(request.Remark))
  136. {
  137. user.Remark = request.Remark;
  138. }
  139. user.UpdateTime=DateTime.Now;
  140. _wrapper.User.Update(user);
  141. await _wrapper.SaveChangeAsync();
  142. }
  143. /// <summary>
  144. /// 批量删除用户
  145. /// </summary>
  146. /// <param name="ids"></param>
  147. /// <exception cref="Exception"></exception>
  148. public async Task DeleteBatchUserAsync(List<int> ids)
  149. {
  150. var list =await _wrapper.User.FindByCondition(x=>ids.Contains(x.Id)).ToListAsync();
  151. foreach (var item in list)
  152. {
  153. item.IsDeleted = true;
  154. _wrapper.User.Update(item);
  155. }
  156. await _wrapper.SaveChangeAsync();
  157. }
  158. /// <summary>
  159. /// 查询用户拥有的角色
  160. /// </summary>
  161. /// <param name="organizationId"></param>
  162. /// <param name="userId">用户id</param>
  163. /// <returns></returns>
  164. public async Task<QueryRoleByUserIdResponse> QueryRoleByUserIdAsync(int organizationId,int userId)
  165. {
  166. var response = new QueryRoleByUserIdResponse();
  167. //拿到角色列表
  168. var roleIds =await _wrapper.UserRole.FindByCondition(_=>_.UserId==userId && _.OrganizationId==organizationId && _.IsDeleted==false)
  169. .Select(_=>_.RoleId).ToListAsync();
  170. if (roleIds.Any())
  171. {
  172. foreach (var roleId in roleIds)
  173. {
  174. //拿到具体的角色
  175. var role = _wrapper.Role.FindByCondition(_=>_.Id==roleId && _.IsDeleted==false).FirstOrDefault();
  176. var roleModel = _mapper.Map<RoleModel>(role);
  177. response.RoleModels.Add(roleModel);
  178. }
  179. }
  180. return response;
  181. }
  182. /// <summary>
  183. /// 查询所有的用户
  184. /// </summary>
  185. /// <returns></returns>
  186. public async Task<List<UserModel>> QueryAllUsersAsync()
  187. {
  188. var response = new List<UserModel>();
  189. try
  190. {
  191. var allUsers = await _redisManager.HGetAllValue<User>(RedisKeyGenerator.AllUsersRedisKey());
  192. if (allUsers.Any())
  193. {
  194. response = _mapper.Map<List<UserModel>>(allUsers);
  195. return response;
  196. }
  197. //查数据库,并设置redis;
  198. var users = _wrapper.User.FindAll().Where(_ => _.IsDeleted == false).ToList();
  199. response = _mapper.Map<List<UserModel>>(users);
  200. var usersDic = users.ToDictionary(_ => _.Id);
  201. await usersDic.ParallelForEachAsync(async user =>
  202. {
  203. var redisKey = RedisKeyGenerator.AllUsersRedisKey();
  204. try
  205. {
  206. foreach (var s in users)
  207. {
  208. await _redisManager.HashSet(redisKey, user.Key.ToString(),
  209. JsonConvert.SerializeObject(user.Value));
  210. }
  211. }
  212. catch (Exception e)
  213. {
  214. _logger.LogError(e.Message);
  215. }
  216. });
  217. }
  218. catch (Exception e)
  219. {
  220. _logger.LogError("QueryAllUsersAsync error: {e.Message}");
  221. throw;
  222. }
  223. return response;
  224. }
  225. public void QueryUserByCondition(QueryUserByConditionRequest request)
  226. {
  227. }
  228. }
4. OrganizationManager
  1. using System.Text.RegularExpressions;
  2. using AutoMapper;
  3. using Microsoft.EntityFrameworkCore;
  4. using Microsoft.Extensions.Logging;
  5. using Newtonsoft.Json;
  6. using org.huage.AuthManagement.BizManager.Redis;
  7. using org.huage.AuthManagement.BizManager.wrapper;
  8. using org.huage.AuthManagement.DataBase.Table;
  9. using org.huage.AuthManagement.Entity.Common;
  10. using org.huage.AuthManagement.Entity.Managers;
  11. using org.huage.AuthManagement.Entity.Model;
  12. using org.huage.AuthManagement.Entity.Request;
  13. using org.huage.AuthManagement.Entity.Response;
  14. namespace org.huage.AuthManagement.BizManager.Manager;
  15. //组织管理
  16. public class OrganizationManager : IOrganizationManager
  17. {
  18. private readonly IRepositoryWrapper _wrapper;
  19. private readonly IRedisManager _redisManager;
  20. private readonly ILogger<OrganizationManager> _logger;
  21. private readonly IMapper _mapper;
  22. private readonly IUserManager _userManager;
  23. public OrganizationManager(IRepositoryWrapper wrapper, IRedisManager redisManager,
  24. ILogger<OrganizationManager> logger, IMapper mapper,IUserManager userManager)
  25. {
  26. _wrapper = wrapper;
  27. _redisManager = redisManager;
  28. _logger = logger;
  29. _mapper = mapper;
  30. _userManager = userManager;
  31. }
  32. /// <summary>
  33. /// 查询该组织的用户,以及用户对应的角色:
  34. /// 1.查询该组织下的用户
  35. /// 2.查询用户角色
  36. /// </summary>
  37. /// <param name="organizationId"></param>
  38. public async Task<QueryOrganizationUserAndRoleResponse> QueryOrganizationAllUserAndRoleAsync(int organizationId)
  39. {
  40. var response = new QueryOrganizationUserAndRoleResponse();
  41. try
  42. {
  43. //查询缓存
  44. var organizationUsers =
  45. await _redisManager.HGetAllValue<OrganizationUserAndRole>(RedisKeyGenerator.OrganizationAllUserAndRole(organizationId));
  46. if (organizationUsers.Any())
  47. {
  48. response.Users = organizationUsers;
  49. return response;
  50. }
  51. //1.从中间表中查询出该组织对应的用户有那些,然后拿到用户信息
  52. var userIdList = await _wrapper.OrganizationUser
  53. .FindByCondition(_ => _.OrganizationId == organizationId && _.IsDeleted == false).Select(_ => _.UserId)
  54. .ToListAsync();
  55. //2.拿到所有的用户
  56. if (userIdList.Any())
  57. {
  58. foreach (var userId in userIdList)
  59. {
  60. //拿到用户
  61. var user = _wrapper.User.FindByCondition(_ => _.Id == userId && _.IsDeleted==false).FirstOrDefault();
  62. if (user is null)
  63. {
  64. continue;
  65. }
  66. var realUser = _mapper.Map<OrganizationUserAndRole>(user);
  67. //拿到该用户的角色id列表
  68. var ids = await _wrapper.UserRole
  69. .FindByCondition(_ => organizationId == _.OrganizationId && userId == _.UserId)
  70. .Select(_ => _.RoleId).ToListAsync();
  71. foreach (var id in ids)
  72. {
  73. //拿到角色
  74. var role = _wrapper.Role.FindByCondition(_ => _.Id == id).FirstOrDefault();
  75. //添加进入集合
  76. var roleModel = _mapper.Map<RoleModel>(role);
  77. realUser.RoleModels?.Add(roleModel);
  78. }
  79. //加入返回结果集
  80. response.Users.Add(realUser);
  81. }
  82. }
  83. var userAndRoles = response.Users.ToDictionary(_ => _.Id);
  84. //添加缓存
  85. await userAndRoles.ParallelForEachAsync(async ur =>
  86. {
  87. var redisKey = RedisKeyGenerator.OrganizationAllUserAndRole(organizationId);
  88. try
  89. {
  90. foreach (var s in response.Users)
  91. {
  92. await _redisManager.HashSet(redisKey, RedisKeyGenerator.OrganizationUser(ur.Key),
  93. JsonConvert.SerializeObject(ur.Value));
  94. }
  95. }
  96. catch (Exception e)
  97. {
  98. _logger.LogError(e.Message);
  99. }
  100. });
  101. }
  102. catch (Exception e)
  103. {
  104. _logger.LogError($"Excuse QueryOrganizationUserAndRole error: {e.Message}");
  105. throw;
  106. }
  107. return response;
  108. }
  109. //查询所有的组织
  110. public async Task<QueryAllOrganizationResponse> QueryAllOrganizationAsync()
  111. {
  112. var response = new QueryAllOrganizationResponse();
  113. try
  114. {
  115. //查缓存
  116. var value = await _redisManager.HGetAllValue<Organization>(RedisKeyGenerator.AllOrganizationsRedisKey());
  117. if (value.Any())
  118. {
  119. response.OrganizationModels = _mapper.Map<List<OrganizationModel>>(value);
  120. return response;
  121. }
  122. //查询数据库
  123. var organizationList = await _wrapper.Organization.FindByCondition(_ => _.IsDeleted == false).ToListAsync();
  124. response.OrganizationModels = _mapper.Map<List<OrganizationModel>>(organizationList);
  125. //设置缓存
  126. var organizationDic = organizationList.ToDictionary(_ => _.Id);
  127. await organizationDic.ParallelForEachAsync(async organization =>
  128. {
  129. var redisKey = RedisKeyGenerator.AllOrganizationsRedisKey();
  130. try
  131. {
  132. foreach (var s in organizationDic)
  133. {
  134. await _redisManager.HashSet(redisKey, organization.Key.ToString(),
  135. JsonConvert.SerializeObject(organization.Value));
  136. }
  137. }
  138. catch (Exception e)
  139. {
  140. _logger.LogError(e.Message);
  141. }
  142. });
  143. }
  144. catch (Exception e)
  145. {
  146. _logger.LogError($"QueryAllOrganizationAsync error: {e.Message}");
  147. throw;
  148. }
  149. return response;
  150. }
  151. /// <summary>
  152. /// 查询该组织明细
  153. /// </summary>
  154. /// <param name="organizationId"></param>
  155. /// <returns></returns>
  156. public async Task<OrganizationModel> QueryOrganizationDetailAsync(int organizationId)
  157. {
  158. var organization = _wrapper.Organization.FindByCondition(_ => _.Id == organizationId).FirstOrDefault();
  159. return _mapper.Map<OrganizationModel>(organization);
  160. }
  161. /// <summary>
  162. /// 批量删除
  163. /// </summary>
  164. /// <param name="ids"></param>
  165. public async Task<bool> BatchDeleteOrganizationByIdAsync(List<int> ids)
  166. {
  167. if (!ids.Any())
  168. return false;
  169. foreach (var id in ids)
  170. {
  171. var first = _wrapper.Organization.FindByCondition(_ => _.Id == id && _.IsDeleted==false).FirstOrDefault();
  172. if (first is not null)
  173. {
  174. //逻辑删除
  175. first.IsDeleted = true;
  176. _wrapper.Organization.Update(first);
  177. //删除关联表organizationUser
  178. var organizationUserList = await _wrapper.OrganizationUser.FindByCondition(_=>_.OrganizationId==id && _.IsDeleted==false).ToListAsync();
  179. if (organizationUserList.Any())
  180. {
  181. foreach (var organizationUser in organizationUserList)
  182. {
  183. //逻辑删除
  184. organizationUser.IsDeleted = true;
  185. _wrapper.OrganizationUser.Update(organizationUser);
  186. }
  187. }
  188. }
  189. }
  190. return true;
  191. }
  192. /// <summary>
  193. /// 组织添加用户:添加用户的时候,可以选择是否给该用户配角色
  194. /// </summary>
  195. /// <summary>
  196. /// 比如说A组织创建了一个用户a,然后用户表插入了一个用户(手机号唯一),接着在organizationUser表加入一条id, A.ID , a.id的的数据;
  197. /// 然后我们给该A组织的a用户设置角色的时候,我们去UserRole表加入一条数据:userid,roleId,organizationId.
  198. ///
  199. /// 这时候B组织把a也加入自己的组织了,给该用户设置B组织a用户的权限:在UserRole角色表里面加入一条,userid,roleId,organizationId.
  200. /// 希望解决同一个用户在不同系统拥有不同的权限:逻辑就是组织添加用户的时候,加入organizationUser表,并且需要给其授予角色(默认是游客),也可以从用户表中挑选用户;
  201. /// </summary>
  202. public async Task<bool> OrganizationAddUserAsync(AddOrganizationUserRequest request)
  203. {
  204. if (!IsValidOrgCode(request.OrganizationId.ToString()))
  205. throw new OrganizationException("OrganizationId invalid,please fill in valid orgCode");
  206. if (string.IsNullOrEmpty(request.UserModel.Phone))
  207. throw new OrganizationException("Phone is required.");
  208. //开启事务
  209. await using var transaction = await _wrapper.StartTransactionAsync();
  210. try
  211. {
  212. //添加用户
  213. var addUser = await _userManager.AddUserAsync(request.OrganizationId, request.UserModel);
  214. //添加OrganizationUser
  215. var organizationUserModel = new OrganizationUserModel()
  216. {
  217. OrganizationId = request.OrganizationId,
  218. UserId = addUser.Id
  219. };
  220. var organizationUser = _mapper.Map<OrganizationUser>(organizationUserModel);
  221. _wrapper.OrganizationUser.Create(organizationUser);
  222. //添加UserRole
  223. if (request.RoleModels != null && request.RoleModels.Any())
  224. {
  225. foreach (var role in request.RoleModels)
  226. {
  227. var userRoleModel = new UserRoleModel()
  228. {
  229. UserId = addUser.Id,
  230. OrganizationId = request.OrganizationId,
  231. RoleId = role.Id
  232. };
  233. var userRole = _mapper.Map<UserRole>(userRoleModel);
  234. _wrapper.UserRole.Create(userRole);
  235. }
  236. }
  237. else
  238. {
  239. //设置该用户默认角色为游客
  240. var ur = new UserRoleModel()
  241. {
  242. UserId = addUser.Id,
  243. OrganizationId = request.OrganizationId,
  244. RoleId = 2
  245. };
  246. var userRole = _mapper.Map<UserRole>(ur);
  247. _wrapper.UserRole.Create(userRole);
  248. }
  249. await _wrapper.SaveChangeAsync();
  250. await transaction.CommitAsync();
  251. }
  252. catch (UserException ex)
  253. {
  254. await transaction.RollbackAsync();
  255. _logger.LogError(ex.Message);
  256. throw;
  257. }
  258. catch (Exception e)
  259. {
  260. //发生异常回滚
  261. await transaction.RollbackAsync();
  262. _logger.LogError($"Excuse OrganizationAddUser error: {e.Message}");
  263. throw;
  264. }
  265. return true;
  266. }
  267. /// <summary>
  268. /// 新增组织
  269. /// </summary>
  270. /// <param name="request"></param>
  271. /// <exception cref="Exception"></exception>
  272. public async Task AddOrganizationAsync(AddOrganizationRequest request)
  273. {
  274. try
  275. {
  276. //params check
  277. if (string.IsNullOrEmpty(request.OrgCode) ||
  278. string.IsNullOrEmpty(request.Name))
  279. {
  280. throw new OrganizationException("组织名称和组织注册编码不能为空");
  281. }
  282. if (string.IsNullOrEmpty(request.Version))
  283. {
  284. request.Version = "v1";
  285. }
  286. //mapping
  287. var organization = _mapper.Map<Organization>(request);
  288. _wrapper.Organization.Create(organization);
  289. await _wrapper.SaveChangeAsync();
  290. }
  291. catch (Exception e)
  292. {
  293. _logger.LogError($"Excuse AddOrganization error: {e.Message}");
  294. throw;
  295. }
  296. }
  297. /// <summary>
  298. /// 判断传进来的营业执照是否有效,这里可以根据自己的业务具体实现,当前假设为邮箱
  299. /// </summary>
  300. /// <param name="orgCode"></param>
  301. /// <returns></returns>
  302. private bool IsValidOrgCode(string orgCode)
  303. {
  304. var regex = new Regex("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$");
  305. return regex.IsMatch(orgCode);
  306. }
  307. }

Api模块:暴露接口,程序启动

目录接口:

Example :OrganizationController
  1. namespace org.huage.AuthManagement.Api.Controllers;
  2. [ApiController]
  3. [Route("/[controller]/[action]")]
  4. public class OrganizationController : Controller
  5. {
  6. private readonly IOrganizationManager _organizationManager;
  7. private readonly ILogger<OrganizationController> _logger;
  8. public OrganizationController(IOrganizationManager organizationManager, ILogger<OrganizationController> logger)
  9. {
  10. _organizationManager = organizationManager;
  11. _logger = logger;
  12. }
  13. [HttpPost]
  14. public async Task<bool> OrganizationAddUser(AddOrganizationUserRequest request)
  15. {
  16. try
  17. {
  18. return await _organizationManager.OrganizationAddUserAsync(request);
  19. }
  20. catch (OrganizationException ex)
  21. {
  22. _logger.LogError(
  23. $"Error in org.huage.Service.OrganizationManager.OrganizationController.OrganizationAddUser. {ex.Message}");
  24. throw;
  25. }
  26. catch (Exception e)
  27. {
  28. var organizationExceptionException = new OrganizationException(e.Message);
  29. _logger.LogError(
  30. $"Error in org.huage.Service.OrganizationManager.OrganizationController.OrganizationAddUser.");
  31. throw organizationExceptionException;
  32. }
  33. }
  34. }

 

测试:基于Swagger测试

Example: 

备注:查全量数据的时候都集成了Redis,经过postman本地测试,基本所有接口响应时间都可以控制在50ms内,基于Redis查全量数据的时候能控制在10ms以内。

完整项目地址:(整理中,后续贴上)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/989877
推荐阅读
相关标签
  

闽ICP备14008679号